Szymciosek
29.05.2012, 18:22:18
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
29.05.2012, 19:05:41
To trzymać w cookie ? A co dalej z takim czymś zrobić ? sprawdzać czy takie cookie istnieje, jeśli tak to zalogowany ?
greycoffey
29.05.2012, 19:05:45
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
29.05.2012, 19:06:31
greycoffey możesz mnie bardziej na to naprowadzić ?
greycoffey
29.05.2012, 19:10:03
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.
SELECT * FROM users WHERE login='jan' AND haslo=MD5('Baltazar');
-- zamiast tego robisz:
SELECT * FROM users WHERE token='hash_z_losowego_ciagu_znakow';
Szymciosek
29.05.2012, 19: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 ?
greycoffey
29.05.2012, 19:28:26
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
30.05.2012, 09:49:10
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
30.05.2012, 13:46:58
Nie dajesz ciasteczka, ani nie generujesz tokenu. Działa to tak jak zwykle.
Szymciosek
30.05.2012, 14:53:57
Ale sesja jakaś musi być ? Ze względu na ciągłe poruszanie się między stronami żebym był zalogowany.
IProSoft
30.05.2012, 15:06:44
Musi ponieważ bez tego nie będziesz wiedział czy user jest zalogowany np
if($_SESSION['zalogowany'] == 'tak'){
//zalogowany
}
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
30.05.2012, 16:18:55
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
30.05.2012, 20:00:22
Mam problem z cookies, teraz już robię to zapamiętaj mnie tylko po to żeby się nauczyć

Ale do rzeczy, mam w głównym folderze plik index.php
a w innym folderze login mam pliki login_form.php i login.php, ten drugi robi:
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
30.05.2012, 20:12:36
Szymciosek
30.05.2012, 21:58:33
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.