- X-Frame-Options/CSP frame-ancestors gegen Clickjacking, nosniff, Referrer-Policy, Permissions-Policy - Origin-Check als CSRF-Defense-in-Depth für /api/admin/users und /logout (zusätzlich zu SameSite=Lax-Cookies und JSON-Content-Type)
18 lines
711 B
TypeScript
18 lines
711 B
TypeScript
// CSRF-Schutz (Defense-in-Depth) für schreibende Route-Handler:
|
||
// Browser senden bei Cross-Site-POSTs immer einen Origin-Header –
|
||
// stimmt er nicht mit dem Host überein, wird die Anfrage abgelehnt.
|
||
// (Erste Verteidigungslinie sind bereits die SameSite=Lax-Session-
|
||
// Cookies von @supabase/ssr sowie der JSON-Content-Type.)
|
||
export function isSameOrigin(request: Request): boolean {
|
||
const origin = request.headers.get("origin");
|
||
// Kein Origin-Header: kein Browser-Cross-Site-Kontext (z. B. curl);
|
||
// die Authentifizierung greift trotzdem.
|
||
if (!origin) return true;
|
||
const host = request.headers.get("host");
|
||
try {
|
||
return new URL(origin).host === host;
|
||
} catch {
|
||
return false;
|
||
}
|
||
}
|