La protezione CSRF (Cross-Site Request Forgery) è una misura di sicurezza fondamentale per prevenire che attori malevoli inducano un utente autenticato a eseguire azioni indesiderate su un'applicazione web. Questo articolo illustra come implementare una semplice ma efficace protezione CSRF utilizzando PHP nativo.
1. Cos'è un token CSRF?
Un token CSRF è una stringa casuale generata dal server e associata alla sessione dell'utente. Viene inserito in ogni form HTML che effettua una richiesta pericolosa (POST, PUT, DELETE) e verificato dal server alla ricezione della richiesta.
2. Generazione del token
All'inizio della sessione, generiamo un token CSRF e lo memorizziamo nella sessione:
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
3. Inclusione del token nel form
Ogni form HTML che effettua una richiesta sensibile deve includere il token come campo nascosto:
<form method="POST" action="processa.php">
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
<input type="text" name="dati">
<button type="submit">Invia</button>
</form>
4. Verifica del token
Nel file che riceve la richiesta (es. processa.php
), il token va verificato prima di eseguire qualsiasi azione:
session_start();
if (!isset($_POST['csrf_token'], $_SESSION['csrf_token']) ||
!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
http_response_code(403);
echo "Token CSRF non valido.";
exit;
}
// Eseguire le operazioni sicure
$dati = $_POST['dati'];
5. Considerazioni finali
- Utilizzare
hash_equals()
per evitare attacchi di timing. - Rigenerare il token dopo azioni critiche può aumentare la sicurezza.
- Applicare questa protezione a tutte le azioni che modificano lo stato sul server.
Questa implementazione manuale fornisce una base solida per difendersi dagli attacchi CSRF in PHP. In ambienti complessi o framework, è consigliabile utilizzare soluzioni integrate.