Mam aplikację PHP, która wymaga logowania, oferuje opcję wylogowania i wymusza wylogowanie użytkowników, którzy byli nieaktywni przez X minut.

Ale jeśli się zaloguję, zamknę przeglądarkę i ponownie ją otwórz, zmienne $_SESSION nadal istnieją.

Jaka jest tutaj ogólna praktyka? Czy powinienem chcieć temu zapobiec, a jeśli tak, to w jaki sposób?

Coś we mnie po prostu chce traktować zamknięcie przeglądarki jako wylogowanie… z jednej strony jest to bezpieczna aplikacja (ponieważ wymaga logowania), ale użytkownik bez technologii może rozsądnie oczekiwać, że jeśli zamknie całą przeglądarkę, to nikt nie może zobaczyć ich prywatne dane. Otoh, jeśli przeglądarka ulegnie awarii, a użytkownik ją zrestartuje, może mieć nadzieję, że wznowi to od miejsca, w którym przerwał...

Co robią inni?

1
Mawg says reinstate Monica 31 maj 2011, 12:54
+1 „dowolny”. i jakikolwiek". To kwestia najlepszych praktyk i powinna być niezależna.
 – 
Mawg says reinstate Monica
3 czerwiec 2011, 06:02

3 odpowiedzi

Najlepsza odpowiedź

Sesje PHP działają poprzez zapisanie w przeglądarce użytkownika pliku cookie zawierającego identyfikator sesji na serwerze. Dlatego sesje PHP działają dokładnie tak, jak zwykłe pliki cookie.

Jeśli zamkniesz przeglądarkę, pliki cookie są trwałe. Serwer nie wie, jakiego wystąpienia przeglądarki używa użytkownik, czy przeglądarka została ponownie uruchomiona, a nawet czy komputer został ponownie uruchomiony.

Udostępnienie przycisku wylogowania jest tutaj najczęstszą praktyką, ale jeśli z jakiegoś powodu chcesz, aby użytkownik wylogował się po zamknięciu przeglądarki, będziesz musiał zaimplementować coś po stronie klienta, ponieważ przeglądarka tego nie robi wyślij dowolny sygnał do serwera po jego zamknięciu.

Jeśli obawiasz się o bezpieczeństwo - tzn. programujesz wysoce bezpieczną aplikację, taką jak bramka płatnicza - możesz postępować zgodnie z praktyką stron internetowych banków lub innych bramek płatniczych;

Gdy użytkownik powraca do witryny, nadal jest zalogowany, ale gdy próbuje wykonać jakąkolwiek czynność, która wpłynie na zalogowanego użytkownika, ponownie uwierzytelnij się za pomocą innego ekranu hasła lub poproś o kilka niezapomnianych informacji.

4
Greg 31 maj 2011, 13:22
+1 Dzięki. Niestety nie mogę polegać na stronie klienta, ponieważ użytkownik może wyłączyć JS, a ja wdrażam w miejsce, które może nawet zabraniać JS :-( ale dziękuję za pomoc w nauce czegoś
 – 
Mawg says reinstate Monica
31 maj 2011, 16:12
1
Chodzi o to, że jesteś po stronie klienta z plikami cookie. Jeśli chcesz wchodzić w interakcję z plikami cookie, możesz wysłać nagłówki żądania za pomocą PHP, ale to przekreśla punkt sesji.
 – 
Greg
1 czerwiec 2011, 13:38

To klasyczne zachowanie, możesz je zaobserwować na wielu stronach, w tym na Stack Overflow :) Twoja zmienna sesji jest powiązana z plikiem cookie w przeglądarce. Jeśli chcesz, aby użytkownik naprawdę był wylogowany po zamknięciu przeglądarki, ustawia czas sesyjnego pliku cookie na zero.

2
solendil 31 maj 2011, 13:19
+1 Dzięki za to. Nie umieszczam ciasteczka w swoim kodzie, ale przyznaję, że nie rozumiem wszystkich subtelności sesji czy ciasteczek. Teraz wiem, jak uniknąć tego zachowania – czy mogę zdecydować, czy chcę…
 – 
Mawg says reinstate Monica
31 maj 2011, 16:11

Gdy wyraźnie ustawisz plik cookie, możesz wybrać jego czas wygaśnięcia. Kiedy używasz session_start() do wygenerowania pliku cookie sesji, jego czas wygaśnięcia jest określany przez wartość session.cookie_lifetime w php.ini. Jeśli ustawisz to na 0, sesyjne pliki cookie wygasną po zamknięciu okna przeglądarki.

2
Jason 8 sierpień 2011, 23:52
+1 Dzięki. Szczególnie za poświęcenie czasu na dodanie informacji do starego, zamkniętego pytania. Pomoże to tym, którzy mogą później to przeczytać
 – 
Mawg says reinstate Monica
11 sierpień 2011, 03:43