CORS-Fehlkonfiguration: die Wildcard- und Reflection-Fallen
Cross-Origin Resource Sharing (CORS) steuert, welche anderen Websites Antworten deiner API lesen dürfen. Eine Policy mit Wildcard oder reflektiertem Origin kann jeder Website erlauben, authentifizierte Anfragen zu stellen und die Ergebnisse zu lesen.
Was es ist
Browser blockieren standardmäßig Cross-Origin-Lesevorgänge. CORS-Header lockern das selektiv. Access-Control-Allow-Origin: * öffnet die Antworten für jede Website.
Ein subtilerer Bug ist Origin-Reflection: Der Server gibt jeden Origin, den die Anfrage mitbringt, im allow-origin-Header zurück, was praktisch allen vertraut, während es spezifisch aussieht.
Warum es wichtig ist
Wenn deine API Nutzerdaten ausliefert und Credentials erlaubt, lässt eine zu weit gefasste CORS-Policy eine bösartige Website die Daten eines eingeloggten Opfers direkt aus deiner API lesen.
Reflection in Kombination mit Access-Control-Allow-Credentials: true ist besonders gefährlich — sie hebt den Same-Origin-Schutz auf, der Nutzerdaten normalerweise privat hält.
So behebst du es
Validiere den Anfrage-Origin gegen eine feste Liste vertrauenswürdiger Domains und gib ihn nur dann zurück.
const ALLOWED = new Set(["https://app.yourdomain.com"]);
const origin = req.headers.get("origin") ?? "";
const allow = ALLOWED.has(origin) ? origin : "";
// only set the header when allow is non-emptyBrowser verbieten Access-Control-Allow-Origin: * zusammen mit Credentials, daher reflektieren Apps manchmal stattdessen den Origin — und genau das ist die Schwachstelle. Verwende stattdessen eine strikte Allowlist.
Braucht ein Endpoint keinen Cross-Origin-Zugriff, sende gar keine CORS-Header. Öffne nur die konkreten Routen, die es wirklich benötigen.
FAQ
Ist Access-Control-Allow-Origin: * immer schlecht?
Nicht für wirklich öffentliche, credential-freie Ressourcen (z. B. eine öffentliche Schriftart oder eine Open-Data-API). Für alles, was an eine Nutzersitzung gebunden ist, ist es gefährlich.
Schützt CORS meinen Server?
Nein — CORS wird vom Browser durchgesetzt, nicht vom Server. Es regelt, was das JavaScript anderer Websites lesen kann, nicht, ob eine Anfrage dich erreicht.
Ist deine App betroffen?
AppSafe prüft dies und Dutzende weitere Probleme in einem kostenlosen Scan.
Meine App gratis scannenVerwandte Guides
Die Cookie-Flags Secure, HttpOnly und SameSite
Drei Flags, die verhindern, dass Session-Cookies gestohlen werden.
Content-Security-Policy (CSP): was sie ist und wie du eine hinzufügst
Der Header, der verhindert, dass eingeschleuste Skripte ausgeführt werden.
API-Keys, die in clientseitigem JavaScript offengelegt sind
Alles in deinem Bundle ist öffentlich. Behandle es entsprechend.