Hoe deze controle werkt
Scanaris kijkt in het hoofdantwoord van je pagina of twee headers aanwezig zijn: Cross-Origin-Opener-Policy (COOP) en Cross-Origin-Resource-Policy (CORP). Ontbreekt er een of ontbreken beide, dan opent hij één bevinding met lage ernst die aangeeft welke. Hij beoordeelt de waarde niet, alleen de aanwezigheid. Dit zijn de twee origin-isolatieheaders die het makkelijkst in te voeren zijn; de derde van de familie, Cross-Origin-Embedder-Policy, wordt niet vereist omdat die elke externe bron breekt die niet meewerkt en op een normale site zelden loont.
Wat elk beschermt
COOP bepaalt of je venster een "browsing-contextgroep" deelt met het venster dat het opende of met de vensters die jij opent. Met same-origin heeft een pagina op een ander domein die de jouwe opent met window.open geen bruikbare verwijzing meer naar jouw venster (en andersom), wat manipulatie-aanvallen tussen tabbladen afsnijdt en de weg sluit waarlangs geheugenlekken van het type Spectre worden uitgebuit. CORP bepaalt wie je bronnen mag insluiten. Met same-origin kan een andere site je afbeeldingen, scripts of lettertypen niet laden met een <img>- of <script>-tag, ook al zijn de URL's openbaar: de browser blokkeert het antwoord voordat het die site bereikt. Geen van beide verhelpt een bestaande fout; het is verdediging in de diepte, en daarom is het ontbreken ervan van lage ernst.
Hoe je ze toevoegt
Aanbevolen waarden voor een site die geen bronnen deelt met andere domeinen:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
- Nuxt: in
routeRulesvannuxt.config, onder de regel'/**', naast je andere headers. - Next.js: in de functie
headers()vannext.config.js. - Vercel: in
vercel.json, sectieheaders. Netlify: in_headers, onder/*. - nginx: twee regels
add_header ... always;in hetserver-blok. Apache:Header always setin de VirtualHost. - Express:
helmet()voegt ze in recente versies standaard toe; controleer welke versie je hebt geïnstalleerd.
Twee dingen om te controleren voordat je ze inschakelt
- Logins via pop-up. Gebruik je "Inloggen met Google" of een andere provider in pop-upmodus, dan moet de pop-up praten met het venster dat hem opende. Met
same-originwerkt dat niet meer; gebruiksame-origin-allow-popups, dat de bescherming behoudt en dit geval toestaat. - Bronnen die je aan andere domeinen serveert. Worden je afbeeldingen of lettertypen geladen vanaf een andere site van jou (een blog op een ander domein, een widget die derden insluiten), dan blokkeert
same-originze daar. Gebruiksame-siteals de andere site een subdomein is, ofcross-originop de specifieke routes van die bronnen.
Controleer of het opgelost is
curl -sI https://jouwdomein.nl | grep -iE "^cross-origin-(opener|resource)-policy:"
Beide regels moeten verschijnen. Open daarna je site, test de login en elke pop-upintegratie, en kijk in de browserconsole: een door CORP geblokkeerde bron verschijnt daar met een expliciete melding.
Veelgestelde vragen
Vervangt dit CORS?
Nee, ze vullen elkaar aan en wijzen in tegengestelde richtingen. CORS opent je antwoorden voor specifieke origins wanneer dat nodig is; CORP sluit ze standaard voor iedereen die ze wil insluiten. Je kunt sitebreed CORP same-origin hebben en CORS open op één API-route.
Heb ik ook Cross-Origin-Embedder-Policy nodig?
Alleen als je SharedArrayBuffer of hogeresolutietimers wilt (videobewerking, emulators, sommige WebAssembly-apps). COEP vereist dat alles wat je insluit CORP of CORS draagt, en de meeste externe scripts doen dat niet. Voor een gewone site zijn COOP en CORP genoeg.
Hoeveel verbetert het het cijfer?
Weinig in punten, omdat het een bevinding met lage ernst is; maar het is een van de weinige verbeteringen zonder bijwerkingen als je de twee controles hierboven doet. De headers die wel gewicht hebben, staan in beveiligingsheaders en worden uitgelegd in HTTP-headers voor mensen.