Sessions und CSRF-Schutz in PHP – Formulare gegen Fremdzugriff absichern
Ein Login ohne CSRF-Schutz lässt sich von fremden Seiten missbrauchen. Ich zeige dir das Token-Muster, das jedes Formular absichert – erzeugen, verstecktes Feld, per hash_equals prüfen – plus die richtigen Session-Cookie-Einstellungen.
Sobald ein PHP-Formular etwas verändert (Login, Speichern, Löschen), braucht es einen CSRF-Schutz. Ohne ihn könnte eine fremde Website deinen eingeloggten Nutzer heimlich ein Formular absenden lassen. Das Gegenmittel ist ein geheimes Token pro Session.
Session sicher starten
<?php
declare(strict_types=1);
session_set_cookie_params([
'httponly' => true, // kein Zugriff per JavaScript (schützt vor XSS-Diebstahl)
'samesite' => 'Lax', // Cookie nicht bei fremden Cross-Site-Requests senden
'secure' => true, // nur über HTTPS
]);
session_start();Token erzeugen und ins Formular legen
function csrf_token(): string
{
if (empty($_SESSION['csrf'])) {
$_SESSION['csrf'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf'];
}
?>
<form method="post" action="/speichern.php">
<input type="hidden" name="csrf" value="<?= htmlspecialchars(csrf_token()) ?>">
<!-- weitere Felder -->
<button type="submit">Speichern</button>
</form>Beim Absenden prüfen
function check_csrf(): void
{
$sent = $_POST['csrf'] ?? '';
if (!is_string($sent) || !hash_equals($_SESSION['csrf'] ?? '', $sent)) {
http_response_code(419);
exit('Sitzung abgelaufen. Bitte lade die Seite neu.');
}
}Zwei Details sind wichtig: random_bytes liefert ein kryptografisch sicheres Token (nicht rand()), und hash_equals vergleicht zeitkonstant – ein normaler ===-Vergleich könnte über minimale Zeitunterschiede angreifbar sein.
Ruf check_csrf() ganz am Anfang jedes POST-Handlers auf, bevor irgendetwas gespeichert wird. Genau dieses Muster steckt auch im Admin-Backend, das ich für meine Kunden baue. Mehr auf bymw.de.
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Eingaben validieren mit filter_var – E-Mail, URL und Zahlen
Nie blind einer Nutzereingabe vertrauen. filter_var prüft E-Mail-Adressen, URLs und Zahlen mit eingebauten Filtern – zuverlässiger und lesbarer als selbstgebaute Regex.
XSS verhindern in PHP – Ausgaben richtig escapen mit htmlspecialchars
SQL-Injection verhinderst du mit Prepared Statements – aber der andere große Angriff, XSS, passiert bei der AUSGABE. Ich zeige dir, warum du jede dynamische Ausgabe mit htmlspecialchars und ENT_QUOTES escapen musst und wie ein kurzer Helfer das übernimmt.
Datei-Uploads in PHP sicher entgegennehmen
Ein Upload-Formular ist schnell gebaut – aber ohne Prüfung ein Einfallstor. Ich zeige dir, wie du Uploads richtig annimmst: echten MIME-Typ prüfen, Größe begrenzen, einen zufälligen Namen vergeben und außerhalb des Web-Roots speichern.