Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Cookies i auto logowanie
Forum PHP.pl > Forum > Przedszkole
Szymciosek
Witam,
wiele czytałem już, że np loginów i haseł nie możemy trzymać w cookie, tak samo uprawnienia użytkownika nie mogą tam być trzymane ze względów bezpieczeństwa.

Więc krótkie pytanie. Jak zrobić takie logowanie z opcją "Remember me" ? Co trzymać w cookies żeby logowanie działało np przez 24h, a co trzymać w sesji ?
!*!
ID + useragent + cokolwiek + IP(choć to ostatnio kwestia sporna) zapisujesz te dane z sha1/md5 czy czymkolwiek.
Szymciosek
To trzymać w cookie ? A co dalej z takim czymś zrobić ? sprawdzać czy takie cookie istnieje, jeśli tak to zalogowany ?
greycoffey
Cytat(!*! @ 29.05.2012, 20:02:56 ) *
ID + useragent + cokolwiek + IP(choć to ostatnio kwestia sporna) zapisujesz te dane z sha1/md5 czy czymkolwiek.

Czy ja wiem? Łatwe do sfabrykowania, jeśli za cokolwiek uznajesz "az@fjd45W_P".

W tabeli w bazie danych dodajesz pole "autologin_token", do którego wkładasz hash losowej liczby/losowego ciągu znaku/cokolwiek losowego. To samo dodajesz do ciasteczka dla uzytkownika. Logujesz go normalnie, tylko zamiast sprawdzania loginu i hasła - sprawdzasz token.
Szymciosek
greycoffey możesz mnie bardziej na to naprowadzić ?
greycoffey
Cytat(Szymciosek @ 29.05.2012, 20:06:31 ) *
greycoffey możesz mnie bardziej na to naprowadzić ?

Na co dokładniej? W cookie trzymasz tylko identyifaktor służący do autologowania, który jest kluczem, tak samo jak para login-hasło. Zamiast na podstawie loginu i hasła logować użytkownika, rozpoznajesz go za pomocą tokenu znajdującego się w cookie, który jest generowany na podstawie losowego ciągu i zapisywany w bazie.
  1. SELECT * FROM users WHERE login='jan' AND haslo=MD5('Baltazar');
  2. -- zamiast tego robisz:
  3. SELECT * FROM users WHERE token='hash_z_losowego_ciagu_znakow';
Szymciosek
1) Przy każdym logowaniu sprawdzam czy token użytkownika jest w bazie i zgadza się z tym który gość ma w cookie ?
2) Przy każdym pierwszym logowaniu (gdy brak cookie -> czyli użytkownik dawno się nie logował albo wcisnął WYLOGUJ) generuję losowy token i zapisuję/aktualizuję z tym, który jest zapisany przy logującym się użytkowniku ?
greycoffey
Cytat(Szymciosek @ 29.05.2012, 20:13:09 ) *
1) Przy każdym logowaniu sprawdzam czy token użytkownika jest w bazie i zgadza się z tym który gość ma w cookie ?
2) Przy każdym pierwszym logowaniu (gdy brak cookie -> czyli użytkownik dawno się nie logował albo wcisnął WYLOGUJ) generuję losowy token i zapisuję/aktualizuję z tym, który jest zapisany przy logującym się użytkowniku ?

1) Taki schemat:
Jeśli użytkownik nie jest azlogowany a posiada ciastko o nazwie 'token':
Sprawdź czy istnieje w bazie, jeśli tak, zaloguj go.
Jeśli nie - usuń.
W przeciwnym wypadku pomiń te akcje.

2) Tak.

Polecam do tego ciastko ustawić z flagą httpOnly aby zapobiec niektórym rodzajom przechwyceń. Więcej w manualu do funkcji setcookie.
Szymciosek
Co zrobić w przypadku, gdy użytkownik nie zaznaczy REMEMBER ME ? Ustawić to samo ciasteczko na 15min czy np stworzyć do tego sesję działającą na zasadzie -> jeśli poruszasz się po stronie, jesteś zalogowany / zamkniesz zakładkę czy przeglądarkę zostajesz wylogowany ?
greycoffey
Nie dajesz ciasteczka, ani nie generujesz tokenu. Działa to tak jak zwykle.
Szymciosek
Ale sesja jakaś musi być ? Ze względu na ciągłe poruszanie się między stronami żebym był zalogowany.
IProSoft
Musi ponieważ bez tego nie będziesz wiedział czy user jest zalogowany np

  1. if($_SESSION['zalogowany'] == 'tak'){
  2. //zalogowany
  3. }
!*!
Cytat(Szymciosek @ 30.05.2012, 15:53:57 ) *
Ale sesja jakaś musi być ? Ze względu na ciągłe poruszanie się między stronami żebym był zalogowany.


Sesja a ciastko to 2 zupełnie inne rzeczy. Poza tym, ta opcja "zapamiętaj mnie" brzmi jak z poprzedniej epoki. Po coś w przeglądarkach są menadżery haseł, które rozwiązują problem "ojej, ukradli mi ciastko, cóż począć oh oh".

Co do sposobu który podał greycoffey, pamiętaj że im więcej użytkowników, tym zapytania o token mogą trwać dłużej, dlatego przyda się odpowiednie cache tych danych.
Szymciosek
Czyli wg tego co piszesz już mało gdzie robi się "zapamiętaj mnie" ?
Do prostych rzeczy mogę zrobić tylko sesję i wtedy mi to działa przez jakiś czas lub póki poruszam się po stronie tak ? Ale jak to ma się z wielkimi rzeczami ? Np jakieś forum. Co jeśli z jednego komputera (przeglądarki) na jednym forum logują się 2 osoby, z czego jedna spędza tam więcej czasu, więc tu taki menedżer będzie chyba trochę kłopotem skoro za każdym razem i tak muszę wybrać użytkownika z menedżera i go zalogować...
!*!
"zapamiętaj mnie" to relikt z czasu gdy przeglądarki służyły tylko do przeglądania witryn i nie miały opcji zapamiętywania hasła. Dzisiaj też jest to używane, chyba tylko z przyzwyczajenia...

Jak masz 2 użytkowników, to chyba logiczne że muszą się za każdym razem logować. Nie ma tu znaczenia jak.
Szymciosek
Mam problem z cookies, teraz już robię to zapamiętaj mnie tylko po to żeby się nauczyć biggrin.gif
Ale do rzeczy, mam w głównym folderze plik index.php
  1. print_r($_COOKIE);...


a w innym folderze login mam pliki login_form.php i login.php, ten drugi robi:
  1. setcookie('token', 'wart', time()+3600);...


Czytałem o jakimś czwartym parametrze, bo był CHYBA podobny temat na forum, ale za nic nie wiem jak go ustawić żeby to wszystko działało i w index wyświetlało mi zawartość ciasteczka.
IProSoft
setcookie
  1. setcookie('token', 'wart', time()+3600, '/');
Szymciosek
Dzięki, co prawda też tak próbowałem, ale coś nie działało, ale na przykładzie z nowym ciastkiem wszystko działa sprawnie, więc muszę przejrzeć to co zrobiłem do tej pory.
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.