Dlaczego i kiedy powinienem używać session_regenerate_id()
funkcji w PHP? Czy powinienem go zawsze używać po użyciu session_start()
? Czytałem, że muszę go używać, aby zapobiec utrwalaniu sesji, czy to jedyny powód?
php
session
session-fixation
rvandoni
źródło
źródło
Odpowiedzi:
Co to jest
session_regenerate_id()
?Jak mówi nazwa funkcji, jest to funkcja, która zastąpi identyfikator bieżącej sesji nowym i zachowa informacje o bieżącej sesji.
Co to robi?
Pomaga głównie zapobiegać atakom utrwalania sesji. Ataki polegające na fiksacji sesji mają miejsce, gdy złośliwy użytkownik próbuje wykorzystać lukę w systemie, aby naprawić (ustawić) identyfikator sesji (SID) innego użytkownika. W ten sposób uzyskają pełny dostęp jako pierwotny użytkownik i będą mogli wykonywać zadania, które w innym przypadku wymagałyby uwierzytelnienia.
Aby zapobiec takim atakom, przypisz użytkownikowi nowy identyfikator sesji, używając,
session_regenerate_id()
gdy pomyślnie się zaloguje (lub dla każdego X żądań). Teraz tylko on ma identyfikator sesji, a twój stary (naprawiony) identyfikator sesji nie jest już ważny.Kiedy stosować
session_regenerate_id()
?Jak wskazuje symbecean w komentarzach poniżej, identyfikator sesji należy zmienić przy każdym przejściu w stan uwierzytelniania i tylko przy przejściach uwierzytelniania.
Czytaj dalej:
źródło
Należy używać
session_regenerate_id()
, aby zatrzymać przechwytywanie sesji i utrwalanie sesji .Z tego Security.SE odpowiedź :
Z tej strony internetowej :
Kiedy użyć
Gdy użytkownik edytuje / aktualizuje niektóre ważne dane wejściowe (zmiana haseł, poświadczeń, zapomnienie haseł itp.), Które mogą naruszyć bezpieczeństwo witryny lub politykę prywatności.
Zobacz też:
Podręcznik bezpieczeństwa PHP: sesje
Utrwalanie sesji (miły odczyt)
źródło
Myślę, że kwestia zatrucia sesyjnego została całkiem dobrze omówiona.
Aby odpowiedzieć na pytanie „Kiedy należy tego używać?” część, ważne jest, aby cofnąć się i zastanowić się, co robi aplikacja z sesją. Inaczej mówiąc, jest to kluczowe pytanie bezpieczeństwa, na które musisz odpowiedzieć
Jeśli wszystko, co robisz, to śledzenie anonimowych danych (użytkownik przychodzi na stronę i używasz ich do śledzenia jego odwiedzin), nie ma powodu, aby ponownie generować sesję. Porywacz nie zyskałby nic wartościowego, przechwytując tę sesję.
Jednak wiele witryn oferuje logowanie. Logowanie zmienia wiele rzeczy. Mam dostęp do mojego profilu. Mogę zmienić ustawienia. Więc porywacz może chcieć uzyskać dostęp do mojego konta, zwłaszcza jeśli zwykli użytkownicy i administratorzy używają sesji do zarządzania loginem. Więc kiedy ludzie przychodzą do mojej witryny i logują się, regeneruję sesję. Dodaje dodatkową warstwę bezpieczeństwa, że mój nowo zalogowany użytkownik jest mniej podatny na przejęcie.
Za każdym razem, gdy dodajemy krytyczne dane do sesji, należy rozważyć ponowne wygenerowanie identyfikatora sesji. Jeśli chcesz zabezpieczyć swoją aplikację przed utrwaleniem, przydatna może być losowa regeneracja, ale NIGDY nie regenerowałbym jej na każde żądanie. Domyślnie PHP przechowuje sesje w plikach na dysku lokalnym. Dodajesz dużo dysków we / wy, aby złagodzić to, co jest stosunkowo małym wektorem ataku. Jeśli naprawdę potrzebujesz większego bezpieczeństwa, zalecałbym korzystanie z pełnego HTTPS zamiast regularnej regeneracji (HTTPS sprawia, że naprawienie jest bardzo trudne).
źródło
Dlaczego powinienem używać
session_regenerate_id
?Powinieneś go użyć, aby zapobiec utrwalaniu sesji .
Kiedy stosować
session_regenerate_id
?Za każdym razem, gdy zmienia się stan uwierzytelniania, dotyczy to głównie logowania i wylogowywania.
Przykład
Bob siedzi na publicznym komputerze i przeglądając stackoverflow.com, otwiera tam nową sesję. Identyfikator sesji jest zapisywany w pliku cookie (z
httpOnly
flagą uniemożliwiającą dostęp przez JavaScript). Wyobraźmy sobie, że Stack Overflow miał zawsze włączony HTTPS, a takżesecure
ustawioną flagę dla pliku cookie.Jak możemy teraz ukraść sesję?
Bob zapisuje identyfikator sesji. Opuszcza komputer bez zamykania przeglądarki. Teraz Alice przychodzi do tego komputera i widzi, że przepełnienie stosu jest już załadowane. Loguje się teraz.
Teraz jesteśmy na etapie, na którym powinieneś użyć
session_regenerate_id
. Jeśli nie utworzysz tutaj nowego identyfikatora sesji podczas logowania, Bob mógłby użyć poprzedniej sesji, którą zapisał, aby uzyskać dostęp do sesji Alicji i byłby teraz zalogowany jako Alicja.źródło
session_regenerate_id()
wydano, Alicja może uzyskać dostęp do konta bobs? czy to prawda?Możesz go użyć dla większego bezpieczeństwa.
W ten sposób tworzysz identyfikatory sesji do jednorazowego użytku.
Powiedzmy, że Twój identyfikator sesji użytkownika to = 3
Jakiś haker zhakował Twojego klienta i zdobył jego session_id. Więc haker może użyć tego pliku cookie do korzystania z sesji.
Jeśli masz kod taki jak
możesz zmieniać ich sesję za każdym razem, gdy korzystają z Twojej witryny.
Teraz haker otrzymuje sessionid = 3
ale zmieniłeś sesję po tym, jak tego użył, więc twój
użytkownik ma sessionid = 4 // auth
haker ma session = 3 // null
Ale jest mały punkt, który pozwala powiedzieć, że używasz metody regeneracji, a twój klient po prostu loguje się do witryny i zamyka przeglądarkę lub jest nieaktywny. Twój klient ma identyfikator sesji = 4 i jeśli haker otrzyma pliki cookie w tej części, będzie miał ten sam identyfikator sesji.
Jak wyjaśniono powyżej, w ten sposób możesz chronić swojego klienta przed podsłuchiwaniem danych w jeden sposób, ale nadal nie rozwiąże to problemu na dobre.
Ale będzie to o wiele bardziej bezpieczne, jeśli używasz szyfrowania SSL.
Przepraszam, za słaby angielski.
źródło
Prosty przypadek użycia:
// User visits a webshop $shopcart = new Cart();
Rozpoczęto sesję i dokonano wpisu do bazy danych. Koszyk użytkownika jest identyfikowany przez jego identyfikator sesji.
// User orders items $shopcart->add('123', 20); $shopcart->add('124', 18); $shopcart->add('127', 5);
Dla każdego dodanego produktu tworzony jest zapis w mojej tabeli zakupów. Identyfikowany również przez identyfikator sesji.
// User saves cart in order to use it later $shopcart->save();
Użytkownik zdecydował się zapisać swój koszyk. Jest teraz dołączany do jego identyfikatora użytkownika.
// Regenerate session id for user to be able to make a new cart session_regenerate_id();
Identyfikator sesji jest regenerowany i użytkownik może teraz rozpocząć od tworzenia kolejnego koszyka.
źródło
if(session_status() == PHP_SESSION_ACTIVE) { session_regenerate_id(); }
źródło