Dieser Code implementiert einen sicheren Schutz gegen Cross-Site Request Forgery (CSRF). Er erzeugt zufällige Tokens, die bei jeder Formularübertragung geprüft werden. Dadurch wird verhindert, dass Angreifer unbefugt Aktionen im Namen eines eingeloggten Nutzers ausführen können.
<?php
$secure = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on';
session_set_cookie_params([
'lifetime' => 0,
'path' => '/',
'domain' => '',
'secure' => $secure,
'httponly' => true,
'samesite' => 'Strict'
]);
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
function csrf_token(int $ttlSeconds = 1800): string {
if (empty($_SESSION['csrf']['value']) || empty($_SESSION['csrf']['time'])) {
$_SESSION['csrf']['value'] = bin2hex(random_bytes(32));
$_SESSION['csrf']['time'] = time();
} elseif (time() - $_SESSION['csrf']['time'] > $ttlSeconds) {
$_SESSION['csrf']['value'] = bin2hex(random_bytes(32));
$_SESSION['csrf']['time'] = time();
}
return $_SESSION['csrf']['value'];
}
function csrf_verify(?string $token, bool $oneTime = true, int $ttlSeconds = 1800): bool {
if (!isset($_SESSION['csrf']['value'], $_SESSION['csrf']['time'])) {
return false;
}
if ($token === null) {
return false;
}
if (time() - $_SESSION['csrf']['time'] > $ttlSeconds) {
return false;
}
$valid = hash_equals($_SESSION['csrf']['value'], $token);
if ($valid && $oneTime) {
unset($_SESSION['csrf']);
}
return $valid;
}
function csrf_input(): string {
$token = htmlspecialchars(csrf_token(), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
return '<input type="hidden" name="csrf" value="'.$token.'">';
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!csrf_verify($_POST['csrf'] ?? null)) {
http_response_code(403);
exit('Ungültiges CSRF Token');
}
echo 'Formular sicher verarbeitet';
}
?>
<form method="post" action="">
<?= csrf_input() ?>
<input type="text" name="beispiel" placeholder="Text">
<button type="submit">Senden</button>
</form>