Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Logowanie i sesje
Forum PHP.pl > Forum > Przedszkole
wgasowski
Witam,
od jakiegoś już czasu we wszystkich moich projektach używałem sesji jako mechanizmu pamiętającego czy użytkownik się zalogował czy nie.
Ostatnio jednak przyszedł mi do głowy pomysł, że moje rozwiązanie nie jest chyba dobre.

Zasada działania jest bardzo prosta. Wysyłam formularz metodą POST do jakiegoś skryptu, tam sprawdzane jest czy pola zostały wypełnione, porównywane są z jakimś wzorcem (pliki, baza danych, itd.) i w przypadku powodzenia do zmiennej sesyjnej zapisywany jest ID użytkownika, który się zalogował. Wówczas "tajna" część strony zostaje odblokowana poprzez spełnienie prostego warunku (jeżeli zmienna sesyjne jest niepusta to użytkownik jest zalogowany). Przykładowy kod poniżej:

  1. <?
  2. //logowanie
  3. if($_POST['login'] == 'test' && $_POST['haslo'] == 'test')
  4. $_SESSION['logged'] = 5; //przykladowe ID uzytkownika test
  5.  
  6. //dostep do tajnej strony
  7. if($_SESSION['logged']!='') echo 'To jest tajna wiadomosc';
  8. else echo 'Zaloguj sie';
  9. ?>

Moje pytanie jest następujące: czy i na ile jest to bezpieczne rozwiązanie? Jedyną weryfikacją tego czy użytkownik jest zalogowany czy nie jest sprawdzenie zawartości zmiennej sesyjnej $_SESSION['logged'].
Gdyby mechanizm oparty był o COOKIE wówczas bez problemu można byłoby zmienić (ręcznie) wartość COOKIE na dowolną różną od pustej. Jak ma się to w porównaniu z sesjami? O ile dobrze pamiętam, dane sesji zapamiętywane są także w COOKIE?

Proszę o pomoc.

Z góry dzięki, pozdrawiam
Wojtek
dadexix
sesje działają w sposób prosty:
->Wysłanie session id do servera przez cookie
-Server sprawdza id sessji w bazie(domyślnie opartej na plikach schowanych w systemie(lub jeśli użyjesz session_save_path" title="Zobacz w manualu PHP" target="_manual są w określonym przez Ciebie miejscu, za pomocą Session_handler" title="Zobacz w manualu PHP" target="_manual można użyć bazy sql czy własnego systemu plików, po sprawdzeniu wszysykie dane w sesjach przesyłane są do skryptu a Ty tam możesz je zmieniać/usuwać/dodawać przez tablice $_SESSION

Gdy masz cookie wszystko to co trzymasz w bazie sessji masz w pliku cookie a co za tym idzie? - user sam może zmieniać dane bez Twojej wiedzy!

Chyba wiadome że sesje bezpieczniejsze:)

A dodatkowo z własnego doświadczenia powiem Ci że lepiej nie tylko id trzymać w sessji ale i inne dane które nie są duże i mogą się często przydać, przykładowo mamy sytuacje user chce zmienić hasło, więc podaje stare i nowe, by sprawdzić czy stare jest poproawne odpytujesz baze i porównujesz, a przecież mogłeś zrobić to samo tylko na sessjach..smile.gif wiele przykładów można... oczywiście sessji nie wolno zapychać czym się da, aczkowiek takie dane jak poziom uprawnień(user, admin,mod[..]), nick, pass, id można trzymać:)
grzegorz_m
Cytat
user chce zmienić hasło, więc podaje stare i nowe, by sprawdzić czy stare jest poproawne odpytujesz baze i porównujesz, a przecież mogłeś zrobić to samo tylko na sessjach..

Przecież pytanie w stylu "podaj stare hasło" ma za zadanie wyeliminować możliwość zmiany hasła przez tzw. osoby trzecie, gdy Ty np. jesteś w WC aaevil.gif
Nie widzę więc sensu robienia tego w sesji, bo takowa nie ma możliwości sprawdzić, czy rzeczywiście ja siedzę na fotelu przed moim komputerem a nie np. mój dowcipny kolega/brat/siostra/itd.
dadexix
chodziło mi o inną rzecz... gdy masz pass w sessjach robisz
if($_GET['pass'] == $_SESSION['pass'])
A ile czasu by zajeło połączenie z bazą, ściągnięcie, sprawdzenie?(a pisanie tego? też troche)

To był przykład, że bardziej się opłaca trzymać dane proste dane w sessji niż tylko w bazie ale bez przesady, nie mówie tylko o zmienia pass ale o mniejscach gdzie lepiej poprosic o pass po raz drugi:)


Tylko wole sobie powtórzyć - nie trzymać all w sessji bo nie ma po co:)


Lecz schodzimy z tematu, poprostu, jeśli ID usera ma być dowodem na zalogowanie i jest wybór sessje/cookie to wiadome ze sessje bo cookie możesz edytować i "być" kimś innym:)
Anonymous
Czyli dane zawarte w tablicy $_SESSION mogą być zmieniane tylko przez serwer i ich edycja jest niedostępna dla zwykłego użytkownika, co powoduje, że używanie tego sposobu jest bezpieczne? smile.gif
Shili
Tak, jeden z nielicznych problemów spokojnie możesz rozwiązać dzięki używaniu podanego wcześniej session_save_path" title="Zobacz w manualu PHP" target="_manual
wgasowski
Cytat(dadexix @ 10.07.2008, 05:50:16 ) *
sesje działają w sposób prosty:
->Wysłanie session id do servera przez cookie
-Server sprawdza id sessji w bazie(domyślnie opartej na plikach schowanych w systemie(lub jeśli użyjesz session_save_path" title="Zobacz w manualu PHP" target="_manual są w określonym przez Ciebie miejscu, za pomocą Session_handler" title="Zobacz w manualu PHP" target="_manual można użyć bazy sql czy własnego systemu plików, po sprawdzeniu wszysykie dane w sesjach przesyłane są do skryptu a Ty tam możesz je zmieniać/usuwać/dodawać przez tablice $_SESSION

Dzięki właśnie o to mi chodziło. Po napisaniu tego posta jeszcze się zastanawiałem i doszedłem do wniosku, że w cookie przechowywany jest tylko identyfikator sesji, która z kolei zapisana jest gdzieś na serwerze (bez możliwości ingerencji ze strony użytkownika).

Chciałbym zaznaczyć, że ta odpowiedź mi pomogła, ale albo nie mogę znaleźć tej opcji albo muszę wykorzystać mechanizm sesji w praktyce będąc zalogowanym tongue.gif

Dzięki i pozdrawiam!
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.