// 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 ist bereits das SameSite=Lax-Session-Cookie, // siehe lib/auth/session.ts, 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; } }