In de architectuur van een moderne webapplicatie zijn Content-Security-Policy (CSP) en HTTP Strict-Transport-Security (HSTS) de twee absolute zwaargewichten. Volgens de methodologie van headeraudit.nl is CSP de zwaarst wegende header; het ontbreken ervan degradeert je score direct naar een C. Veel developers vermijden CSP uit angst voor downtime of gebroken functionaliteit. Deze angst is echter het gevolg van een gebrekkig proces, niet van de techniek zelf.
Strategisch belang
De overstap van een reactieve houding (pleisters plakken na een XSS-melding) naar een proactieve security-by-design strategie met CSP levert een aanzienlijke kostenbesparing op. Het voorkomen van script-injectie aan de browserzijde is vele malen efficiënter en goedkoper dan het ad-hoc patchen van individuele kwetsbaarheden na een incident.
De sandbox: Content-Security-Policy-Report-Only
De Content-Security-Policy-Report-Only header is je veiligheidsnet. Hiermee dwing je geen restricties af, maar instrueer je de browser om elke overtreding te loggen. Dit stelt je in staat om exact te zien welke resources (scripts, stijlen, fonts) je momenteel gebruikt, inclusief de beruchte inline scripts (unsafe-inline) die vaak de grootste hindernis vormen bij implementatie.
Moderne implementaties maken gebruik van de Reporting API (report-to), de opvolger van de verouderde report-uri directive. De browser stuurt een JSON-payload naar je endpoint die je moet interpreteren om je beleid te verfijnen.
Stappenplan voor een risicoloze uitrol:
- Logging opzetten — Configureer een endpoint (eigen API of externe service zoals Sentry of Report-URI) om JSON-rapportages te ontvangen.
- Dataverzameling — Draai de site in Report-Only modus. Focus specifiek op het identificeren van legitieme inline scripts en third-party domeinen.
- Policy iteratie — Voeg ontdekte bronnen stapsgewijs toe aan je policy. Gebruik nonces of hashes voor noodzakelijke inline scripts in plaats van
unsafe-inlinesimpelweg toe te staan. - Handhaving — Pas wanneer de rapportages nul legitieme blokkades vertonen, schakel je over naar de handhavende
Content-Security-Policyheader.
Configuratie in de praktijk
Gebruik de volgende snippets om de Report-Only header te implementeren. Let op het gebruik van de always parameter bij Nginx om de header ook bij foutmeldingen (4xx/5xx) mee te sturen.
Nginx
add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; report-to endpoint-name;" always;
Apache
Header set Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; report-to='endpoint-name'"
Caddy
header {
Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self'; report-to endpoint-name"
}Datagestuurde security-beslissingen via Report-Only elimineren het giswerk bij CSP. Wil je direct met een strikte basispolicy starten, bekijk dan het volledige stappenplan op de CSP-pagina.