Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Cookies i auto logowanie
Szymciosek
post 29.05.2012, 18:22:18
Post #1





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
!*!
post 29.05.2012, 19:02:56
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


ID + useragent + cokolwiek + IP(choć to ostatnio kwestia sporna) zapisujesz te dane z sha1/md5 czy czymkolwiek.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Szymciosek
post 29.05.2012, 19:05:41
Post #3





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


To trzymać w cookie ? A co dalej z takim czymś zrobić ? sprawdzać czy takie cookie istnieje, jeśli tak to zalogowany ?
Go to the top of the page
+Quote Post
greycoffey
post 29.05.2012, 19:05:45
Post #4





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post
Szymciosek
post 29.05.2012, 19:06:31
Post #5





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


greycoffey możesz mnie bardziej na to naprowadzić ?
Go to the top of the page
+Quote Post
greycoffey
post 29.05.2012, 19:10:03
Post #6





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


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';
Go to the top of the page
+Quote Post
Szymciosek
post 29.05.2012, 19:13:09
Post #7





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
greycoffey
post 29.05.2012, 19:28:26
Post #8





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


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.

Ten post edytował greycoffey 29.05.2012, 19:30:29
Go to the top of the page
+Quote Post
Szymciosek
post 30.05.2012, 09:49:10
Post #9





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
greycoffey
post 30.05.2012, 13:46:58
Post #10





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Nie dajesz ciasteczka, ani nie generujesz tokenu. Działa to tak jak zwykle.
Go to the top of the page
+Quote Post
Szymciosek
post 30.05.2012, 14:53:57
Post #11





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


Ale sesja jakaś musi być ? Ze względu na ciągłe poruszanie się między stronami żebym był zalogowany.
Go to the top of the page
+Quote Post
IProSoft
post 30.05.2012, 15:06:44
Post #12





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


Musi ponieważ bez tego nie będziesz wiedział czy user jest zalogowany np

  1. if($_SESSION['zalogowany'] == 'tak'){
  2. //zalogowany
  3. }


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
!*!
post 30.05.2012, 16:13:55
Post #13





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Szymciosek
post 30.05.2012, 16:18:55
Post #14





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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ć...
Go to the top of the page
+Quote Post
!*!
post 30.05.2012, 16:21:47
Post #15





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


"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.


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Szymciosek
post 30.05.2012, 20:00:22
Post #16





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
IProSoft
post 30.05.2012, 20:12:36
Post #17





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

Ostrzeżenie: (0%)
-----


setcookie
  1. setcookie('token', 'wart', time()+3600, '/');


Ten post edytował IProSoft 30.05.2012, 20:13:18


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
Szymciosek
post 30.05.2012, 21:58:33
Post #18





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 12:46