- Neue Umgebungsvariable APP_URL (docker-compose reicht sie durch, Default http://localhost:3000): gilt beim CSRF-Origin-Check als eigene Origin, falls ein Reverse-Proxy den Host-Header umschreibt - scripts/configure-passkeys.mjs setzt die Passkey-Domain (WebAuthn rp_id/origins) des Supabase-Projekts auf APP_URL – ein Befehl statt manueller Dashboard-Konfiguration beim Domain-Wechsel
23 lines
1010 B
TypeScript
23 lines
1010 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 {
|
||
const originUrl = new URL(origin);
|
||
if (originUrl.host === host) return true;
|
||
// Hinter einem Reverse-Proxy, der den Host-Header umschreibt, gilt
|
||
// zusätzlich die öffentlich konfigurierte App-URL als eigene Origin.
|
||
const appUrl = process.env.APP_URL;
|
||
return !!appUrl && originUrl.origin === new URL(appUrl).origin;
|
||
} catch {
|
||
return false;
|
||
}
|
||
}
|