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