Kiedy i dlaczego powinienem używać session_regenerate_id ()?

96

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?

rvandoni
źródło
ponieważ po rozpoczęciu sesji jest tworzony, a na innej stronie po uruchomieniu sesji obecne są zmienne: -
HaRsH
@HaRsH Oo? Session_regenerate_id usuwa stary identyfikator sesji i tworzy nowy, aby na przykład uniknąć przechwytywania sesji przez XSS. Nie ma to żadnego wpływu na widoczność zmiennych SESSION w innych dokumentach.
Xatenev
tak, wiem, że nie mam wpływu na inną zmienną, ale jeśli nie rozpoczniesz sesji na tej stronie, zmienna nie jest obecna na tej stronie w rdzeniu php
HaRsH
1
Ale to jest o session_regenerate_id, a nie o session_start ...
Xatenev
1
Proponuję przeczytać RFC tam, gdzie został zaproponowany: wiki.php.net/rfc/precise_session_management
jankal,

Odpowiedzi:

98

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:

Amal Murali
źródło
2
A co się stanie, jeśli haker wykona 20. połączenie? Identyfikator sesji został zmieniony i tylko on jest właścicielem sesji;))
fred727
@ fred727 Jeśli haker będzie miał szczęście, że trafi na 20. wywołanie, użytkownik będzie miał nieprawidłowy identyfikator i nie będzie już uwierzytelniany. Bez regeneracji w ogóle zarówno haker, jak i użytkownik byliby uwierzytelnieni.
Bradmage
przydałoby się również wywołanie session_regenerate_id podczas przechowywania poufnych informacji w sesjach (a więc nie tylko przy tansingach uwierzytelniania)
Adam
Czy można naprawić sesję, jeśli informacje o sesji nie znajdują się w pliku cookie? Przechowuję informacje o sesji w plikach na moim serwerze, czy konieczne jest ponowne wygenerowanie identyfikatora?
Gonzalo
"aby naprawić (ustawić) identyfikator sesji (SID) innego użytkownika" .... to powinno zostać zastąpione przez "naprawić (ustawić) identyfikator sesji (SID) na komputerze innego użytkownika, a następnie użyć go po uwierzytelnieniu "
Księgowy م
25

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.

Z tej strony internetowej :

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ż:

Podręcznik bezpieczeństwa PHP: sesje

Utrwalanie sesji (miły odczyt)

Dimag Kharab
źródło
22

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

Machavity
źródło
2
HTTPS nie zmienia niczego przy utrwalaniu.
kelunik 10.12.15
4
Ale sprawia, że ​​ataki węszące są trudniejsze, co można by wykorzystać przede wszystkim do uzyskania identyfikatora sesji.
demonkoryu
moja aplikacja php wylogowuje się w ciągu kilku sekund, używam regeneracji, czy istnieje limit plików sesji, które można utworzyć, czy też istnieje limit ponownie wygenerowanych identyfikatorów, które mogą powodować wylogowanie?
sqlchild
Nie ogólnie, nie. Możesz zadać osobne pytanie na ten temat
Machavity
17

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 httpOnlyflagą uniemożliwiającą dostęp przez JavaScript). Wyobraźmy sobie, że Stack Overflow miał zawsze włączony HTTPS, a także secureustawioną 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.

kelunik
źródło
Ale do tego czasu, kiedy session_regenerate_id()wydano, Alicja może uzyskać dostęp do konta bobs? czy to prawda?
Akam
2
@akam - Jest późno, ale warto odpowiedzieć ... 1. Bob się nie wylogowuje, Alicja może użyć swojego loginu - 2. Bob się wylogowuje, Alicja się nie loguje, Alicja może użyć swojego identyfikatora sesji, ale nie ma aktywnego loginu, aby uzyskać dostęp do jego danych - 3. Bob wylogowuje się, Alicja loguje się, Bob używa identyfikatora sesji, jest aktywny login, Bob uzyskuje dostęp do danych Alicji. Ale żeby być konkretnym: polegaj na bezpieczeństwie skryptów, identyfikator sesji niekoniecznie oznacza, że ​​możesz uzyskać dostęp do danych wylogowanego użytkownika, ale ogólnie rzecz biorąc, jest to możliwe i wysokie ryzyko.
codekandis
15

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.

Hasan Veli Soyalan
źródło
12

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.

Piotr
źródło
4

session_regenerate_id (): nie można odtworzyć identyfikatora sesji - sesja nie jest aktywna

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Anton
źródło