Was macht CSRF-Schutz?
Regeln
- Setze
SameSite=Lax auf allen Cookies – dies blockiert die meisten CSRF-Angriffe standardmäßig
- Verwende
SameSite=Strict für hochsensible Aktionen (Konto löschen, Passwort ändern)
- Implementiere das Double-Submit-Cookie-Muster für benutzerdefinierte APIs: CSRF-Token im Cookie + Anfrage-Header
- Füge CSRF-Tokens in alle HTML-Formulare ein, die zustandsändernde Aktionen ausführen
- Überprüfe die
Origin- und Referer-Header bei zustandsändernden Anfragen als Defense-in-Depth
- Next.js Server Actions und SvelteKit form actions behandeln CSRF automatisch – nutze sie
- Für SPAs: Sende CSRF-Token in einem benutzerdefinierten Header (
X-CSRF-Token) – Browser blockieren standardmäßig Cross-Origin-Anfragen mit benutzerdefinierten Headern
import crypto from "crypto";
function generateCsrfToken(res) {
const token = crypto.randomBytes(32).toString("hex");
res.cookie("csrf_token", token, { httpOnly: false, sameSite: "strict", secure: true });
return token;
}
function verifyCsrf(req) {
const cookieToken = req.cookies.csrf_token;
const headerToken = req.headers["x-csrf-token"];
if (!cookieToken || cookieToken !== headerToken) {
throw new Error("CSRF validation failed");
}
}
Vermeide
- Dich nur auf Cookie-basierte Authentifizierung ohne CSRF-Schutz zu verlassen – jede Website kann Formulare an deine Endpunkte senden
- CSRF-Tokens, die nie rotiert werden – ein einziger durchgesickerter Token gefährdet alle zukünftigen Anfragen
- GET-Anfragen, die den Zustand ändern – CSRF-Schutz funktioniert nur bei POST/PUT/DELETE, weil GET-Anfragen die SameSite=Lax-Regel umgehen
- Den CSRF-Schutz zu deaktivieren, weil „es nur eine API ist“ – wenn Cookies involviert sind, gilt CSRF