Files
2026-10-21 21:58:07 +02:00

43 lines
1.2 KiB
PHP

<?php
/**
* lib/csrf.php
*
* Protection CSRF par jeton de session. A inclure sur toutes les pages
* /admin qui affichent ou traitent des formulaires POST (deja inclus
* automatiquement via admin_auth.php).
*
* Usage dans un formulaire :
* <?= csrf_field() ?>
*
* Usage en debut de traitement POST :
* require_csrf_token();
*/
declare(strict_types=1);
function csrf_token(): string
{
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
function csrf_field(): string
{
return '<input type="hidden" name="csrf_token" value="' . htmlspecialchars(csrf_token()) . '">';
}
/**
* A appeler en tout debut de bloc `if ($_SERVER['REQUEST_METHOD'] === 'POST')`.
* Coupe la requete avec un 403 si le jeton est absent ou invalide.
*/
function require_csrf_token(): void
{
$submitted = $_POST['csrf_token'] ?? '';
$expected = $_SESSION['csrf_token'] ?? '';
if ($expected === '' || !hash_equals($expected, $submitted)) {
http_response_code(403);
die('Requete invalide (jeton CSRF manquant ou incorrect). Rechargez la page et reessayez.');
}
}