session_regenerate_id în PHP

Schimbă identificatorul sesiunii și păstrează datele. Se apelează la autentificare, contra atacurilor de tip session fixation.

Sintaxă
session_regenerate_id(bool $delete_old_session = false): bool

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.