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?
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?
Odpowiedzi:
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.
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.
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:
Należy używać session_regenerate_id()
, aby zatrzymać przechwytywanie sesji i utrwalanie sesji .
Z tego Security.SE odpowiedź :
Przechwytywanie sesji oznacza kradzież pliku cookie sesji. Najłatwiej można to osiągnąć, udostępniając sieć lokalną innym komputerom. Np. W Starbucks. Przykład ... użytkownik z sesją Y przegląda witrynę Jamesa w Starbucks. Nasłuchuję ich ruchu sieciowego, popijając latte. Biorę pliki cookie użytkownika z sesji Y dla witryny Jamesa i ustawiam przeglądarkę tak, aby z nich korzystała. Teraz, gdy otwieram witrynę Jamesa, witrynę Jamesa.
Session Fixation to technika ataku, która wymusza na identyfikatorze sesji użytkownika jawną wartość. W zależności od funkcjonalności docelowej witryny internetowej, można zastosować szereg technik, aby „naprawić” wartość identyfikatora sesji. Techniki te obejmują zarówno exploity cross-site Scripting, jak i wykorzystanie w witrynie internetowej wcześniej wykonanych żądań HTTP. Po naprawieniu identyfikatora sesji użytkownika osoba atakująca będzie czekać, aż ten użytkownik się zaloguje. Gdy użytkownik to zrobi, osoba atakująca wykorzystuje predefiniowaną wartość identyfikatora sesji, aby przyjąć tę samą tożsamość online.
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ż:
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ć
Gdyby ktoś zatrzymał się na tej sesji, co by zyskał?
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).
session_regenerate_id
?Powinieneś go użyć, aby zapobiec utrwalaniu sesji .
session_regenerate_id
?Za każdym razem, gdy zmienia się stan uwierzytelniania, dotyczy to głównie logowania i wylogowywania.
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że secure
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.
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
session_start();
session_regenerate_id();
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.
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.