Wie diese Prüfung funktioniert
Scanaris schaut in der Hauptantwort deiner Seite nach zwei Headern: Cross-Origin-Opener-Policy (COOP) und Cross-Origin-Resource-Policy (CORP). Fehlt einer oder fehlen beide, öffnet er einen einzigen Befund mit niedrigem Schweregrad, der nennt, welche. Er bewertet nicht den Wert, nur das Vorhandensein. Das sind die beiden Origin-Isolations-Header, die sich am leichtesten einführen lassen; der dritte der Familie, Cross-Origin-Embedder-Policy, wird nicht verlangt, weil er jede Drittanbieter-Ressource bricht, die nicht mitspielt, und sich auf einer normalen Seite selten lohnt.
Was jeder schützt
COOP entscheidet, ob dein Fenster eine „Browsing-Context-Gruppe" mit dem teilt, das es geöffnet hat, oder mit denen, die du öffnest. Mit same-origin hat eine Seite einer anderen Domain, die deine per window.open öffnet, keine nutzbare Referenz mehr darauf (und umgekehrt), was Manipulationsangriffe zwischen Tabs unterbindet und den Weg schließt, über den Speicherlecks vom Typ Spectre ausgenutzt werden. CORP entscheidet, wer deine Ressourcen einbetten darf. Mit same-origin kann eine andere Seite deine Bilder, Skripte oder Schriften nicht per <img>- oder <script>-Tag laden, auch wenn die URLs öffentlich sind: Der Browser blockiert die Antwort, bevor sie diese Seite erreicht. Keiner von beiden behebt einen bestehenden Fehler; sie sind Verteidigung in der Tiefe, und deshalb ist ihr Fehlen von niedrigem Schweregrad.
So fügst du sie hinzu
Empfohlene Werte für eine Seite, die keine Ressourcen mit anderen Domains teilt:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
- Nuxt: in
routeRulesdernuxt.config, unter der Regel'/**', neben deinen anderen Headern. - Next.js: in der Funktion
headers()dernext.config.js. - Vercel: in
vercel.json, Abschnittheaders. Netlify: in_headers, unter/*. - nginx: zwei Zeilen
add_header ... always;imserver-Block. Apache:Header always setim VirtualHost. - Express:
helmet()fügt sie in aktuellen Versionen standardmäßig hinzu; prüf, welche Version du installiert hast.
Zwei Dinge vor dem Aktivieren prüfen
- Logins per Popup. Nutzt du „Mit Google anmelden" oder einen anderen Anbieter im Popup-Modus, muss das Popup mit dem Fenster reden, das es geöffnet hat. Mit
same-origingeht das nicht mehr; nutzesame-origin-allow-popups, das den Schutz behält und diesen Fall erlaubt. - Ressourcen, die du an andere Domains ausliefertst. Werden deine Bilder oder Schriften von einer anderen deiner Seiten geladen (ein Blog auf einer anderen Domain, ein Widget, das Dritte einbetten), blockiert
same-originsie dort. Nutzesame-site, wenn die andere Seite eine Subdomain ist, odercross-originauf den konkreten Routen dieser Ressourcen.
Prüf, ob es behoben ist
curl -sI https://deinedomain.de | grep -iE "^cross-origin-(opener|resource)-policy:"
Beide Zeilen müssen erscheinen. Öffne dann deine Seite, teste den Login und jede Popup-Integration und schau in die Browser-Konsole: Eine von CORP blockierte Ressource taucht dort mit einer eindeutigen Meldung auf.
Häufige Fragen
Ersetzt das CORS?
Nein, sie ergänzen sich und zeigen in entgegengesetzte Richtungen. CORS öffnet deine Antworten bei Bedarf für bestimmte Origins; CORP schließt sie standardmäßig für jeden, der sie einbetten will. Du kannst CORP same-origin seitenweit haben und CORS auf einer API-Route offen.
Brauche ich auch Cross-Origin-Embedder-Policy?
Nur wenn du SharedArrayBuffer oder hochauflösende Timer willst (Videoschnitt, Emulatoren, manche WebAssembly-Apps). COEP verlangt, dass alles, was du einbettest, CORP oder CORS trägt, und die meisten Drittanbieter-Skripte tun das nicht. Für eine gewöhnliche Seite reichen COOP und CORP.
Wie sehr verbessert das die Note?
Wenig in Punkten, weil es ein Befund mit niedrigem Schweregrad ist; aber es ist eine der wenigen Verbesserungen ohne Nebenwirkungen, wenn du die beiden Prüfungen oben machst. Die Header, die wirklich zählen, stehen in Sicherheits-Header und werden in HTTP-Header für Menschen erklärt.