Autentificare Sigură și Managementul Sesiunilor în PHP: Sesiuni și Cookie-uri în PHP

Sesiuni și cookie-uri PHP 8.x Sessions

Ghid de implementare a sesiunilor sigure în PHP: regenerarea ID-ului de sesiune, atributele cookie SameSite/HttpOnly/Secure și protecția împotriva Session Fixation și Hijacking.

Sintaxă
session_start(['cookie_httponly' => true, 'cookie_secure' => true, 'cookie_samesite' => 'Lax']);

Mecanismul de sesiuni din PHP păstrează starea unui utilizator autentificat între cererile HTTP. Dacă sesiunea nu este configurată cu parametri de securitate stricți, aplicația devine vulnerabilă la atacuri de tip Session Hijacking (furtul cookie-ului de sesiune) și Session Fixation.

Pornirea sigură a sesiunii cu opțiuni moderne în PHP 8
<?php

declare(strict_types=1);

// Configurarea parametrilor de securitate direct în apelul session_start()
session_start([
    'cookie_lifetime' => 7200,             // Sesiunea expiră după 2 ore
    'cookie_httponly' => true,             // JavaScript (document.cookie) NU poate citi cookie-ul (previne XSS!)
    'cookie_secure'   => true,             // Cookie-ul este transmis EXCLUSIV prin conexiuni HTTPS criptate
    'cookie_samesite' => 'Lax',            // Protecție nativă împotriva atacurilor CSRF
    'use_strict_mode' => true,             // Previne atacurile de tip Session Fixation
    'sid_bits_per_character' => 6,         // ID-uri de sesiune cu entropie maximă
]);

// 1. Procedura obligatorie la autentificarea utilizatorului (Login):
function autentificaUtilizator(int $userId, string $nume): void {
    // REGENEREAZĂ ID-ul de sesiune și șterge fișierul vechi (esențial împotriva Fixation!):
    session_regenerate_id(true);
    
    $_SESSION['user_id'] = $userId;
    $_SESSION['user_name'] = $nume;
    $_SESSION['ip_adresa'] = $_SERVER['REMOTE_ADDR'] ?? '';
    $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'] ?? '';
    $_SESSION['autentificat_la'] = time();
}

// 2. Procedura de deconectare sigură (Logout complet):
function deconectareUtilizator(): void {
    $_SESSION = [];
    
    // Șterge cookie-ul din browserul utilizatorului
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }
    
    session_destroy();
}

De ce este critic parametrul cookie_httponly: true

Chiar dacă un atacator reușește să găsească o vulnerabilitate XSS în pagina ta și să injecteze un script JavaScript malițios, setarea cookie_httponly => true împiedică scriptul să citească cookie-ul PHPSESSID. Astfel, atacatorul nu poate clona sesiunea utilizatorului pentru a se conecta în contul său.