Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] zaloguj permanentnie
Forum PHP.pl > Forum > Przedszkole
Forti
Witajcie

Potrzebuje u siebie na stronie stworzyć opcje "pozostań zalogowany", jednak nie bardzo wiem jak się za to zabrać ze strony praktyczniej. Czy ustawić zmienne sesyjne w cookie, czy może inne rozwiązanie?
fate
zapisuj w bazie, dopoki sie nie wyloguje nie zmieniaj wartosci.
coz za nowatorstwo
Michael2318
http://forum.php.pl/index.php?s=&showt...t&p=1038442
Forti
ok, coś tam zrobiłem, nawet tworzy mi cookie z odpowiednią nazwą.

Kod, który się wykonuje po prawidłowym wysłaniu formularza (zaznaczona opcja "na zawsze")

  1. if($stmt->rowCount()!=0){ // jeżeli przednie warunki spełnione itp.
  2. echo 'Zalogowałeś się!';
  3. /*
  4.   * Tworzymy sesję dla zalogowanego uzytkownika z:
  5.   * - informacja, ze uzytkownik jest zalogowany
  6.   * - jego id
  7.   */
  8. $_SESSION['logged'] = true;
  9. $_SESSION['login'] = $row['id'];
  10. $baza->query("UPDATE `users` SET `logtime` = NOW() WHERE `login` = '$login'");
  11.  
  12. ////////////////////////
  13. // Od tego momentu mam kod na utworzenie cookie
  14. /////////////////////
  15. $idUzytkownika = $row['id'];
  16. $zywotnoscCiastka = 60 * 60 * 24 * 30; //na 30 dni
  17. $unikalnyKlucz = md5(uniqid(rand(), true));
  18.  
  19. setCookie('autologin', $idUzytkownika . '_' . $unikalnyKlucz, $zywotnoscCiastka);
  20. $baza->query("UPDATE `users` SET `autologin` = '$unikalnyKlucz' WHERE `login` = '$login'"); //login jest deklarowany przed if jako _POST
  21.  
  22.  
  23.  
  24. }



oraz kod, który wykonuje się za każdym razem podczas przeładowania strony:

  1. <?php
  2. if(isset($_COOKIES['autologin'])){ //jeżeli istnieje cookie o tej nazwie to:
  3.  
  4.  
  5.  
  6. // do tych dwóch linijek nie jestem pewien.. znalazłem to w internecie i nie do końca to rozumiem
  7. $login = substr($_COOKIES['autologin'], -33);
  8. $autologinKey = substr($_COOKIES['autologin'], strlen($autologinID) + 1);
  9.  
  10.  
  11. //Sprawdzamy czy użytkownik istnieje - sądze że zabezpieczenia tutaj na razie zerowe
  12. $stmt = $baza->prepare("SELECT login FROM users WHERE login=:login AND autologin=:autologin");
  13. $stmt->bindValue(":login", $login, PDO::PARAM_STR);
  14. $stmt->bindValue(":autologin", $autologinKey, PDO::PARAM_STR);
  15. $stmt->execute();
  16. $row = $stmt->fetch(PDO::FETCH_NUM);
  17. if($stmt->rowCount()!=0){
  18. echo 'Zalogowałeś się!'; // chwilowo echo abym wiedział czy działa i stwierdzam że nie działa, gdyż napis nie zostaje wyświetlony
  19. /*
  20.   * Tworzymy sesję dla zalogowanego uzytkownika z:
  21.   * - informacja, ze uzytkownik jest zalogowany
  22.   * - jego id
  23.   */
  24. $_SESSION['logged'] = true;
  25. $_SESSION['login'] = $row['id'];
  26.  
  27.  
  28. $idUzytkownika = $row['id'];
  29. $zywotnoscCiastka = 60 * 60 * 24 * 30; //na 30 dni mamy być zalogowani
  30. $unikalnyKlucz = md5(uniqid(rand(), true));
  31.  
  32. setCookie('nicelogin', $idUzytkownika . '_' . $unikalnyKlucz, $zywotnoscCiastka);
  33. $baza->query("UPDATE `users` SET `autologin` = '$unikalnyKlucz' WHERE `login` = '$login'");
  34.  
  35. }
  36.  
  37.  
  38.  
  39.  
  40. }
  41. ?>



Wiem że brakuje zabezpieczeń jak IP lub user_agent. Te dodam sobie później. Na razie problem mam taki: tworzy mi cookie autologin podczas logowania, jednak podczas przeładowania strony ono zostaje skasowane.

Kolejna sprawa: jak naprawię sobie ten drugi skrypt, w jaki sposób najłatwiej sprawdzić czy faktycznie to działa? Jak zamknę przeglądarke i otworze to powinienem być nadal zalogowany, prawda?


-------------
edit
-------------
Temat nadal aktualny. Tworzy mi cookie podczas logowania (wraz ze wpisem do bazy danych klucza):

  1. setCookie('autologin', $idUzytkownika . '_' . $unikalnyKlucz, $zywotnoscCiastka);


i podczas sprawdzania przy każdym odświeżeniu strony sprawdzam czy zmienne z cookie zgadzają się z zawartością klucza w bazie:

  1. $login = substr($_COOKIES['autologin'], -33);
  2. $autologinKey = substr($_COOKIES['autologin'], strlen($autologinID) + 1);


Tylko chyba coś mi z tym nie działa smile.gif
Wazniak96
Po co napiszesujesz cookies podczas każdego przeładowania? I po co dodatkowo używasz sesji skoro używasz już cookies?
Forti
Nadpisuje w bazie i w cookie dla bezpieczeństwa - przy każdy przeładowaniu zmienia wartość klucz. Zapobiega to podszyciu się pod cookie itp.

Dlaczego sesja? a to nie wiem, nie robi się tak? ;> analizując skrypty w necie nie zauważyłem innej metody.

Moja logika:


przy każdym przeładowaniu sprawdzamy:
jak istnieje cookie -> porównujemy klucz z wpisem w bazie -> jeżeli true -> tworzymy sesje

jeżeli false -> wpisujemy hasło / login -> jeżeli się zgadza -> tworzymy sesje / cookie z kluczem i wpis w bazie u użytkownika z kluczem


coś mniej wiecej takiego ;]
Wazniak96
Od tego słońca nic nie ogarniam...

Zmień $autologinID na $login.
Drugą sprawą jest ze niepotrzebnie używasz substr skoro wystarczy explode na '_'. Kolejna sprawa to to, że wszędzie operujesz na ciastku autologin a napisujesz nicelogin.
Forti
Mam bardzo nie fajny problem.

Testuje sobie to całe tworzenie cookie itp., kod jaki się wykonuje przy logowaniu:


  1. if($stmt->rowCount()!=0){
  2. echo 'Zalogowałeś się!';
  3. /*
  4.   * Tworzymy sesję dla zalogowanego uzytkownika z:
  5.   * - informacja, ze uzytkownik jest zalogowany
  6.   * - jego id
  7.   */
  8. $_SESSION['logged'] = true;
  9. $_SESSION['login'] = $row['id'];
  10. $baza->query("UPDATE `users` SET `logtime` = NOW() WHERE `login` = '$login'");
  11.  
  12. $idUzytkownika = $row['id'];
  13. $zywotnoscCiastka = 60 * 60 * 24 * 30; //na 30 dni
  14. $unikalnyKlucz = md5(uniqid(rand(), true));
  15.  
  16. setCookie('niceteam', $unikalnyKlucz, time() + 31536000);
  17. setCookie('niceteam_2', $login, time() + 31536000);
  18. $baza->query("UPDATE `users` SET `autologin` = '$unikalnyKlucz' WHERE `login` = '$login'");
  19.  
  20. $cookie = explode('_', $_COOKIES['niceteam']);
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27. }


cookie tworzy ładnie - wszystko działa. Jednak gdy przejdę na inną strone to wszystki cookie utworzone się kasują. Co może być winą? ;]
Rochu
musisz ustalić argument path, by były dostępnie w całej domenie

  1. setCookie('niceteam', $unikalnyKlucz, time() + 31536000, '/');
  2. setCookie('niceteam_2', $login, time() + 31536000, '/'));
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.