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.