Ce face session_regenerate_id
Identificatorul de sesiune funcționează ca o cheie: cine îl are, are acces la cont. Dacă un atacator reușește să îi impună unui utilizator un identificator cunoscut (atacul se numește session fixation), după autentificare ar intra și el în cont.
Soluția este să generezi un identificator nou imediat după autentificare și după orice schimbare de drepturi. session_regenerate_id(true) creează un identificator nou, mută datele pe el și șterge sesiunea veche.
Parametri
| Parametru | Descriere |
|---|---|
$delete_old_session |
Opțional. true șterge imediat datele sesiunii vechi. Implicit false, iar sesiunea veche mai rămâne o vreme pe server. |
Ce returnează
true la succes, false la eroare.
Exemple
Exemplul 1: Identificator nou după autentificare
<?php
session_start();
echo "Înainte: " . session_id() . "<br>";
// parola a fost verificată cu password_verify
session_regenerate_id(true);
$_SESSION["utilizator_id"] = 42;
echo "După: " . session_id();
Rezultat în browser
Înainte: 27efc221938daa0305097068ba087548
După: b41f0c9e7a2d58e3f6c10a94d72e5b83
Greșeli frecvente
- Nu regenerezi identificatorul la autentificare. Aplicația rămâne vulnerabilă la session fixation.
- Apelezi funcția la fiecare încărcare de pagină. Cererile paralele (de exemplu AJAX) pot folosi încă identificatorul vechi și utilizatorul este deconectat aleatoriu. Regenerează doar la autentificare și la schimbarea drepturilor.
Comenzi înrudite
session_start: Pornește sau reia sesiunea vizitatorului, ca să poți păstra date între pagini în $_SESSION.session_destroy / session_unset: Șterge datele sesiunii curente de pe server. Se folosește la deconectare (logout).password_verify: Verifică dacă o parolă introdusă se potrivește cu hash-ul creat de password_hash.