Ghid Complet de Securitate în PHP: SQL Injection, XSS, CSRF și Hashing în PHP

Securitate și hash PHP 8.x Best Practices

Ghidul complet de securitate web pentru PHP 8: tehnici practice împotriva atacurilor SQL Injection (PDO), protecție XSS, validare CSRF și hashing modern cu Argon2id.

Sintaxă
PDO Prepared Statements, htmlspecialchars, hash_equals & password_hash

Securitatea unei aplicații web dezvoltate în PHP începe cu respectarea principiului „Zero Trust”: toate datele provenite de la utilizator (prin formulare $_POST, parametri de query $_GET, antete HTTP sau cookie-uri) sunt considerate potențial malițioase și trebuie tratate corespunzător la intrare, stocare și afișare.

1. Eliminarea completă a riscului de SQL Injection prin PDO Prepared Statements
<?php

declare(strict_types=1);

// Conectare securizată la baza de date cu PDO și tratare excepții
$pdo = new PDO('mysql:host=localhost;dbname=magazin;charset=utf8mb4', 'user_db', 'parola_secreta', [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false, // Obligatoriu: prepared statements reale pe serverul SQL!
]);

$emailUtilizator = $_POST['email'] ?? '';

// CORECT: Folosim parametri numiți (:email). Datele sunt transmise separat de comanda SQL!
$stmt = $pdo->prepare("SELECT id, nume, parola_hash FROM utilizatori WHERE email = :email LIMIT 1");
$stmt->execute([':email' => $emailUtilizator]);
$utilizator = $stmt->fetch();

// GREȘIT (VULNERABIL LA SQL INJECTION - Nu scrie niciodată așa ceva!):
// $pdo->query("SELECT * FROM utilizatori WHERE email = '{$emailUtilizator}'");
2. Protecție XSS, Validare Token CSRF și Stocarea Sigură a Parolelor
<?php

declare(strict_types=1);

// A. HASHING PAROLE: Salvare securizată cu Argon2id (algoritm rezistent la GPU/ASIC)
$parolaNoua = 'ParolaMeaSuperSecreta!2026';
$hashSalvat = password_hash($parolaNoua, PASSWORD_ARGON2ID, [
    'memory_cost' => 65536, // 64 MB
    'time_cost'   => 4,
    'threads'     => 2
]);

// Verificarea parolei la autentificare (returnează boolean):
if (password_verify($parolaNoua, $hashSalvat)) {
    // Parolă corectă!
}

// B. PROTECȚIE CSRF: Validare rezistentă la Timing Attacks cu hash_equals
$tokenPrimit = $_POST['csrf_token'] ?? '';
$tokenValid  = $_SESSION['csrf_token'] ?? '';

if (!hash_equals($tokenValid, $tokenPrimit)) {
    http_response_code(403);
    die('Eroare securitate: Cerere respinsă (CSRF token invalid sau expirat).');
}

// C. PROTECȚIE XSS: Escaparea caracterelor speciale la afișarea în HTML
function e(?string $text): string {
    return htmlspecialchars($text ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
<h1>Bine ai venit, <?php echo e($utilizator['nume']); ?>!</h1>

Rezumatul Regulilor de Aur de Securitate

  • Nu dezactiva niciodată PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION.
  • Nu folosi niciodată funcțiile depășite md5(), sha1() sau algoritmi simpli de criptare pentru autentificare; folosește exclusiv password_hash().
  • Folosește hash_equals() pentru compararea șirurilor sensibile (token-uri API, semnături HMAC) pentru a preveni atacurile de sincronizare pe milisecunde (Timing Attacks).