43 lines
1.2 KiB
PHP
Executable File
43 lines
1.2 KiB
PHP
Executable File
<?php
|
|
class Csrf
|
|
{
|
|
/**
|
|
* Génère UN seul token pour toute la session
|
|
*/
|
|
public static function generateToken(): string {
|
|
if (empty($_SESSION['csrf_token'])) {
|
|
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
|
}
|
|
return $_SESSION['csrf_token'];
|
|
}
|
|
|
|
/**
|
|
* Valide le token soumis
|
|
*/
|
|
public static function validateToken(string $submittedToken): bool {
|
|
$sessionToken = $_SESSION['csrf_token'] ?? '';
|
|
|
|
if (empty($sessionToken)) return false;
|
|
|
|
// ✅ hash_equals évite les attaques par timing
|
|
return hash_equals($sessionToken, $submittedToken);
|
|
|
|
// ⚠️ On NE supprime PAS le token ici (réutilisable)
|
|
}
|
|
|
|
/**
|
|
* Champ HTML à insérer dans les formulaires
|
|
*/
|
|
public static function field(): string {
|
|
$token = self::generateToken();
|
|
return '<input type="hidden" name="csrf_token" value="' . htmlspecialchars($token) . '">';
|
|
}
|
|
|
|
/**
|
|
* Régénère le token (à appeler à la déconnexion)
|
|
*/
|
|
public static function regenerate(): void {
|
|
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
|
}
|
|
|
|
} |