Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przebieg logowania na cookies
Forum PHP.pl > Forum > Przedszkole
robos85
Otóż możecie mi jakoś przedstawić jak przebiega logowanie, oraz późniejsze (np po restarcie przeglądarki) podtrzymanie sesji użytkownika opartej na cookies?
Oraz jak do tego dać wylogowanie?

Do tej pory robiłem logowanie tylko na sesjach - ustawiając odpowiednie zmienne sesyjne.
Dlatego, byłbym wdzięczny gdyby ktoś jakoś mi zobrazował system logowania na cookies
z góry dzięki
MMPrime
Sesje także się opierają na cookie, zauważ że wysyłają one cookie o domyślnej nazwie PHPSID(lub podobnie). Jest to identyfikator z którym są połączone dane które znajdują się na serwerze. Także na cookie jest tylko identyfikator łączący użytkownika z jego danymi.
ayeo
Popraw proszę tytuł tematu na zgdony z regulaminem działu Przedszkole. Mam na myśli dodanie tagów!

Co do Twojego pytania to sesje również opierają się na ciasteczkach. Wygląda to tak, że w ciasteczku zapisuje się id sesji. Jak chcesz zniszczyć sesję to poprostu ustawiasz caisteczko o nazwie PHPSESSID jako puste.
Pozdrawiam!
robos85
chciałbym aby po zalogowaniu było się zalogowanym aż do wylogowania
dobrym rozwiązaniem będzie po poprawnej autoryzacji utworzenie cookie ze zmienną np zalogowany=1.
jeżeli tak, to np jak później pisać warunki, aby sprawdzało?
if isset(zmienna cookie)==1 questionmark.gif
Tylko że jeżeli na zwykłym ciachu to zrobię - jak później loginem, id itp operować - bo mała modyfikacja ciastka i mogę się jako każdy zalogować :/
MMPrime
W ciastku zapisujesz hash:
Kod
setcookie( 'cookie', md5( uniqid() ) );

Hash ten zapisujesz też do bazy danych(np. tabela session).
W tabeli session zapisujesz także id użytkownika do którego to należy(po zalogowaniu wiesz jakie to id).
Następnie robisz proste zapytanie pobierające sesję za pomocą hasha i łączysz je z tabela users po kolumnie user_id by dotrzeć do danych użytkownika.

Przejrzyj sobie kod phpBB2 tam jest w prosty sposób zrobione i powinieneś zrozumieć zasadę działania.
robos85
yhm, a ten hash sesji - hashuję SID czy po prostu sam generuję go?
Resztę już jakoś ogarniam winksmiley.jpg
Berg
Ja stosuje takie rozwiązanie - ustawiam ciasteczko PHPSID na określony czas (w Twoim wypadku będzie do nieskończoność, co wg mnie nie jest do końca rozsądnym rozwiązaniem patrząc od strony bezpieczeństwa). W sesji zapisuje wszystkie potrzebne dane typu nick, liczba punktów użytkownika i tym podobne dane które musiałbyś często pobierać z bazy danych. Potem tworzę ciasteczko z wygenerowanym kodem autoryzacyjnym, zapisuje go dodatkowo do bazy danych. Zalogowanie sprawdzasz przez
  1. <?php
  2. if(isset($_COOKIE['PHPSID']))
  3. ?>
Jeśli istnieje ciasteczko to oznacza, że możesz pobrać bezproblemowo wszystkie dane zapisane w sesji, oszczędzając na zapytaniach do bazy danych. Jeśli chcesz znać nick użytkownika to wywołujesz kod $_SESSION['nick'] i masz nick. Przy jakiś ważnych operacjach w których liczy się sprawdzenie czy klucz sesji nie został złamany sprawdzasz wartość ciasteczka w którym jest wygenerowany klucz autoryzacyjny z tym zapisanym w bazie danych. Jeśli się nie zgadza to niszczysz sesje. Dodatkowo możesz ustawić na każdej stronie session_regenerate_id(true); dzięki czemu identyfikator sesji będzie zmieniany co odwołanie do strony (co praktycznie uniemożliwia włamanie się na stronę za pomocą metody force bruce + edycja ciasteczek.
robos85
Czyli tak:
na początek robię tabelę np. sessions. Jako pola daję tam, session_id oraz user_id.
user_id łączy się z tableą users - polem id (czyli id usera).

w logowaniu sprawdzam najpierw w bazie poprawność loginu i hasła.
jeżeli prawdziwe to:
generuję unikalny kod autoryzacyjny dla sesji,np tak:
  1. <?php
  2. $auth = md5(uniqid(rand(), true));
  3. ?>

Następnie robię cookie:
  1. <?php
  2. setcookie("PHPSID", $auth, time()+3600);
  3. ?>

dane userid oraz auth dodaję do bazy w tabelę session.

I teraz przy każdym odświeżeniu strony sprawdzam czy istnieje cookie - jeżeli istnieje, to porównuję wartość z tym z bazy i już?
Czy może $auth dać również jako zmienną sesyjną i ją porównywać z cookie, żeby nie męczyć sqla zapytaniami.


Jak sądzicie? Dobry mam tok myslenia? Bo muszę napisać jakiś nie mocno skomplikowany mechanizm, ale żeby był też bezpieczny.



Żeby nie robić nowego tematu: hasło wystarczy hashować md5, czy np mieszać w hashu inny hash + email itp?
barthpl
Cytat(robos85 @ 27.08.2008, 15:52:37 ) *
Żeby nie robić nowego tematu: hasło wystarczy hashować md5, czy np mieszać w hashu inny hash + email itp?
Lepiej mieszać bo jak stracisz bazę danych to trudniej będzie ustalić hasła. Ale na to dostałeś już odpowiedź tutaj winksmiley.jpg

Co do tematu to uważam, iż sposób opisany przez -Berg- jest wystarczający. Aczkolwiek dodatkowe zapisanie $auth w sesji niczemu nie przeszkodzi. Musisz jeszcze pamiętać, iż to ciasteczko wygaśnie po 1h od zalogowania więc jeżeli użytkownik będzie coś na stronie działał ponad to zostanie automatycznie wylogowany. Rozwiązanie jest takie aby co jakiś czas je odświeżać (tak mi się wydaje).
robos85
z tą 1 godziną to tylko przykład byłsmile.gif
Czyli ten sposób, po kolei opisany przeze mnie jest dobry - znaczy jeżeli zrobię tak jak opisałem będzie to miało "dobrą" funkcjonalność i będzie bezpieczne?

Swój przykład starałem się właśnie oprzeć na tym powyższym - tylko go rozwinąłem od początku do końca(mam nadzieję).
Jeżeli kolejność jest dobra i kompletna, to zacznę działać, tylko chcę się upewnić że jest OK.
barthpl
wydaje się że tak, tylko pamiętaj o odświeżaniu ciasteczka winksmiley.jpg
robos85
Będę pamiętałsmile.gif
Ustawię ważność na 10 min i będę co odświeżenie ustawiał to samo ciacho z czasem+10 min i chyba będzie ok:)
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.