CSRF attacks trick logged-in users into submitting forms without their knowledge. Add a unique secret token to every form, store it in the session, and verify it on every POST request before processing.
CSRF Protection
Cross-Site Request Forgery prevention using tokens.
// Generate token and store in session
function generateCsrfToken(): string {
if (empty($_SESSION["csrf_token"])) {
$_SESSION["csrf_token"] = bin2hex(random_bytes(32));
}
return $_SESSION["csrf_token"];
}
// Validate submitted token
function validateCsrfToken(string $token): bool {
return isset($_SESSION["csrf_token"])
&& hash_equals($_SESSION["csrf_token"], $token);
}
// In your form:
// <input type="hidden" name="csrf" value="<?= generateCsrfToken() ?>">
// In your form handler:
session_start();
if (!validateCsrfToken($_POST["csrf"] ?? "")) {
http_response_code(403);
die("CSRF token mismatch");
}