Zum Inhalt springen
Deutsch

CSRF-Schutz

csrfProtection ist eine zustandslose CSRF-Abwehr: das Token ist payload.hmac(secret, payload), sodass ein Cookie, das ein Angreifer von einer Geschwister-Subdomain platziert, die Verifikation nicht besteht. Sichere Methoden erzeugen/erneuern das Token; unsichere Methoden (POST/PUT/PATCH/DELETE) müssen ein passendes Cookie und einen passenden Header vorweisen.

import { csrfProtection, CsrfOptions, withMiddleware } from 'actor-ts/http';
const csrf = csrfProtection(
CsrfOptions.create().withSecret(process.env.CSRF_SECRET!),
);
const routes = withMiddleware(csrf, appRoutes);

Bei einem sicheren Request wird das Token als (nicht-HttpOnly-)Cookie gesetzt und zusätzlich an den Handler weitergereicht, der es mit readCsrfToken(req) liest und in ein Formularfeld oder <meta>-Tag einsetzt. Der Browser sendet es beim nächsten unsicheren Request im X-CSRF-Token-Header (oder einem konfigurierten Formularfeld) zurück.

Builder-MethodeFeldDefault
withSecret(s)secreterforderlich, ≥ 16 Bytes
withCookieName(n)cookieName'csrf-token'
withHeaderName(n)headerName'x-csrf-token'
withCookie(attrs)cookiePath=/, Secure, SameSite=Lax
withVerifyOrigin(flag?)verifyOrigintrue — zusätzlich Origin/Referer prüfen
withAllowedOrigins(...o)allowedOriginszusätzlich akzeptierte Origins
withFormField(name)formFieldNameaus — das Token auch aus einem urlencoded Body-Feld lesen

Die leichtgewichtige Alternative — requireSameOrigin

Abschnitt betitelt „Die leichtgewichtige Alternative — requireSameOrigin“

Brauchst du nur Schutz für moderne Browser, weist requireSameOrigin() unsichere-Methoden-Requests ab, deren Origin/Referer-Host nicht der Request-Host ist:

import { requireSameOrigin, withMiddleware } from 'actor-ts/http';
const routes = withMiddleware(requireSameOrigin(), appRoutes);

csrfProtection ist die Doppel-Absicherung (es führt diesen Check ebenfalls aus); requireSameOrigin allein ist leichter, verlässt sich aber darauf, dass der Browser ein korrektes Origin/Referer sendet.

  • CORS — Umgang mit Cross-Origin-Requests.
  • Sicherheit — wo CSRF im Stack sitzt.