CSRF-Schutz selbst implementieren
Cross-Site Request Forgery bedeutet dass eine fremde Seite im Hintergrund Requests an deine Anwendung schickt während ein eingeloggter Nutzer diese Seite besucht. Der Browser schickt dabei automatisch die Session-Cookie mit.
Der Schutz dagegen ist ein zufälliges Token das nur die eigene Seite kennt.
Token generieren und in der Session speichern
function csrfToken(): string
{
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
Im Formular als Hidden-Field einfügen
<form method="POST" action="/aktion">
<input type="hidden" name="csrf_token" value="<?= csrfToken() ?>">
<!-- restliche Felder -->
</form>
Bei jedem POST prüfen
function csrfCheck(): void
{
$token = $_POST['csrf_token'] ?? '';
if (!hash_equals($_SESSION['csrf_token'] ?? '', $token)) {
http_response_code(403);
die('Ungültige Anfrage.');
}
}
hash_equals statt === verhindert Timing-Angriffe.
Am Anfang jeder POST-Verarbeitung aufrufen.
session_start(); csrfCheck(); // jetzt erst die eigentliche Verarbeitung
Token nach Verwendung erneuern
function csrfRotate(): void
{
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
Nach sensiblen Aktionen wie Passwort ändern oder Benutzer löschen aufrufen. Bei normalen Formularen reicht ein Token pro Session.