De regelskaart bij élk antwoord: Content-Security-Policy meten
Content-Security-Policy is de regelskaart die een server bij élk antwoord meesturet: per type — script, stijl, img, frame — staat erin welke bronnen mogen laden. De CSP analyse haalt die kaart op via onze publieke API en leest hem directive voor directive: élke handhavende kop en élke report-only kop apart, want report-only rapporteert zonder te weigeren.
De tool meet wat het beleid toestaat, niet wat er laadt: inline-scripts die mogen omdat er unsafe-inline staat zonder nonce of hash, wildcards die élke host binnenlaten, framing die wagenwijd open staat. Het zijn gemeten feiten uit de kop zelf — HTTP headers laat zien dat deze kop naast de andere beantwoord-koppen staat.
Begin bij je eigen site: plak je eigen adres en lees wat je beleid werkelijk toestaat. Een policy die forms naar élke host laat sturen of frames van élke site toelaat, is een meetbaar tekort — geen smaakoordeel.
1. De kop is het beleid: handhaving of report-only
Een Content-Security-Policy bestaat alleen in de beantwoord-kop: staat hij er en handhavend, dan weigert de browser wat buiten de kaart valt; staat hij er als report-only, dan rapporteert de browser wat hij zou hebben geweigerd en laat hij alles door. Meten begint dus met dat onderscheid — de CSP analyse meldt beide soorten apart en zegt eerlijk wanneer er alleen gerapporteerd wordt en niets geweigerd.
Waar élke handhavende kop apart wordt gelezen, geldt in de browser de som ervan tezamen: wat beide koppen toestaan, mag. Een beleid dat pas door JavaScript van de pagina zelf wordt geplaatst, staat niet in de kop en wordt niet gemeten — wij meten de koppen van het eindantwoord na de redirects.
2. Directive voor directive: wat er effectief geldt
default-src is de vanglijn: staat er script-src apart, dan geldt die; staat hij er niet, dan erft script-src wat default-src zegt. Herhaalt een policy één directive, dan geldt in de browser de laatste met bronnen — de CSP analyse meet élke occurrence en meldt de herhaling. En object-src zonder enige opgave staat per specificatie open: een vak dat niemand sloot, staat op de kaart als open.
Daarna wordt de kaart leesbaar: unsafe-inline in scriptbronnen is een poort die wagenwijd open staat, tenzij er nonces of hashes in dezelfde directive staan — die maken unsafe-inline in moderne browsers nutteloos, en de tool meldt dat verschil. unsafe-eval, data:-scripts, wildcards als * of *.cdn.com en http:-bronnen zijn afzonderlijke gemeten tekorten: de cijfers zijn feiten uit de kop, het oordeel is aan jou.
3. Framing: één regel, vier staten
frame-ancestors bepaalt wie deze pagina in een frame mag zetten. Staat de regel op *, dan kan élke site inlijsten — dat is een fout, geen nuance. Staat er self of none, dan is de kring gesloten. Staat er géén framing-regel, dan staat de pagina voor élke inlijster open en is dat een waarschuwing. En staat er alleen X-Frame-Options, dan is dat erfenis: ouder, maar meegelezen — de CSP analyse meldt het als erfenis en niet als beleid.
Waar frame-ancestors self staat én X-Frame-Options op DENY, betwisten de twee regels elkaar: de modernere laat self toe, de oudere ook dat niet. Meten wat er werkelijk geldt, is het verschil tussen een securitykop die iets belooft en een die iets doet — beveiligingsheaders en website beveiligen zetten dezelfde koppen in het grotere plaatje.