Content Security Policy (CSP)

CSP, Beveiligingsbeleid voor inhoud, Content-Security-Policy header, CSP-header, Inhoudsbeveiligingsbeleid
Content Security Policy (CSP) is een beveiligingsstandaard die helpt cross-site scripting (XSS), clickjacking en andere code-injectie aanvallen te voorkomen door te controleren welke bronnen op een webpagina geladen mogen worden.

Wat is Content Security Policy (CSP)?

Content Security Policy (CSP) is een krachtige beveiligingslaag die websites beschermt tegen verschillende soorten aanvallen, met name cross-site scripting (XSS) en data-injectie aanvallen. Het werkt als een whitelist-mechanisme waarbij je als website-eigenaar precies kunt specificeren welke bronnen (zoals scripts, stylesheets, afbeeldingen en andere content) geladen mogen worden op jouw website.

CSP wordt geïmplementeerd via HTTP-headers of HTML meta-tags en geeft browsers instructies over welke content vertrouwd en uitgevoerd mag worden. Door strikte regels in te stellen, kun je voorkomen dat kwaadaardige scripts worden uitgevoerd, zelfs als een aanvaller erin slaagt om code in je website te injecteren.

Hoe werkt Content Security Policy?

CSP werkt door middel van directives (richtlijnen) die je definieert in een HTTP-header of meta-tag. Deze directives specificeren voor verschillende content-types welke bronnen toegestaan zijn. Enkele belangrijke directives zijn:

  • default-src: De standaard policy voor alle content-types die niet expliciet gedefinieerd zijn
  • script-src: Bepaalt welke JavaScript-bronnen geladen mogen worden
  • style-src: Controleert welke CSS-stylesheets toegestaan zijn
  • img-src: Specificeert welke afbeeldingsbronnen geladen mogen worden
  • connect-src: Regelt welke URLs benaderd mogen worden via fetch, XMLHttpRequest of WebSocket
  • font-src: Bepaalt van welke bronnen lettertypen geladen mogen worden

Implementatie van CSP

Er zijn twee manieren om CSP te implementeren:

Via HTTP-header: Dit is de meest gebruikelijke en aanbevolen methode. Je configureert de webserver om een Content-Security-Policy header mee te sturen met elke response:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; style-src 'self' 'unsafe-inline';

Via HTML meta-tag: Als je geen toegang hebt tot de serverconfiguratie, kun je CSP ook definiëren in de HTML:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-cdn.com">

CSP-niveaus en reporting

CSP kent verschillende implementatieniveaus. CSP Level 1 biedt de basis-functionaliteit, terwijl CSP Level 2 en 3 uitgebreidere mogelijkheden bieden zoals nonces, hashes en stricter directives.

Een belangrijk aspect van CSP is de reporting-functionaliteit. Met de report-uri of report-to directive kun je schendingen van het beleid laten rapporteren naar een specifieke URL. Dit helpt bij het monitoren en verfijnen van je beveiligingsbeleid.

Voor testdoeleinden kun je ook Content-Security-Policy-Report-Only gebruiken, waarbij schendingen alleen gerapporteerd worden zonder dat de content daadwerkelijk geblokkeerd wordt.

Toepassingen van Content Security Policy

Bescherming tegen XSS-aanvallen

De belangrijkste toepassing van CSP is het voorkomen van cross-site scripting (XSS) aanvallen. Door te specificeren dat alleen scripts van vertrouwde bronnen uitgevoerd mogen worden, kun je voorkomen dat aanvallers kwaadaardige scripts injecteren in je website. Zelfs als een aanvaller erin slaagt om script-tags in je HTML te plaatsen, zal de browser deze weigeren uit te voeren als ze niet voldoen aan het CSP-beleid.

Clickjacking-preventie

Met de frame-ancestors directive kun je bepalen welke websites jouw pagina in een iframe mogen laden. Dit voorkomt clickjacking-aanvallen waarbij aanvallers je website in een onzichtbaar iframe plaatsen om gebruikers te misleiden. Door frame-ancestors in te stellen op 'self' of specifieke vertrouwde domeinen, bescherm je je gebruikers tegen deze aanvalsvorm.

Mixed content blokkeren

CSP helpt bij het afdwingen van HTTPS-gebruik door mixed content (HTTP-content op HTTPS-pagina's) te blokkeren. Met de upgrade-insecure-requests directive kun je browsers instrueren om automatisch alle HTTP-verzoeken naar HTTPS te upgraden, wat de algehele beveiliging van je website verbetert.

Externe resource-controle

Voor websites die gebruik maken van externe services zoals CDN's, analytics-tools of advertising-netwerken, biedt CSP de mogelijkheid om precies te controleren welke externe bronnen toegestaan zijn. Dit voorkomt dat ongeautoriseerde third-party scripts toegang krijgen tot je website en gebruikersdata, wat belangrijk is voor privacy en GDPR-compliance.

E-commerce beveiliging

Voor webshops is CSP essentieel om betaalgegevens en klantinformatie te beschermen. Door strikte CSP-regels te implementeren, voorkom je dat aanvallers betalingsformulieren kunnen manipuleren of gevoelige data kunnen onderscheppen. Dit verhoogt het vertrouwen van klanten en voldoet aan PCI-DSS beveiligingseisen.

Compliance en auditing

CSP-reporting functionaliteit stelt organisaties in staat om beveiligingsincidenten te monitoren en te analyseren. Door schendingen te loggen, kun je patronen ontdekken die wijzen op aanvalspogingen of configuratieproblemen. Dit is waardevol voor security audits en het voldoen aan compliance-vereisten zoals GDPR, ISO 27001 en SOC 2.

Progressive Web Apps (PWA)

Voor Progressive Web Apps is een goed geconfigureerd CSP-beleid vaak een vereiste. Het helpt bij het beveiligen van service workers en zorgt ervoor dat de app alleen vertrouwde bronnen gebruikt, wat cruciaal is voor offline-functionaliteit en app-beveiliging.

Veelgestelde vragen

Content-Security-Policy is de actieve modus waarbij de browser daadwerkelijk content blokkeert die niet voldoet aan het beleid. Dit biedt directe bescherming maar kan ook legitieme functionaliteit breken als het beleid niet correct is geconfigureerd.

Content-Security-Policy-Report-Only daarentegen blokkeert geen content, maar rapporteert alleen schendingen naar de opgegeven report-uri. Deze modus is ideaal voor het testen en verfijnen van je CSP-beleid voordat je het in productie neemt. Je kunt zo ontdekken welke legitieme bronnen geblokkeerd zouden worden zonder dat je website-functionaliteit wordt verstoord.

Het is een best practice om eerst met Report-Only te beginnen, de rapporten te analyseren, je beleid aan te passen, en pas daarna over te schakelen naar de actieve enforcement-modus.

Het implementeren van CSP vereist een zorgvuldige, gefaseerde aanpak om te voorkomen dat bestaande functionaliteit breekt:

  1. Start met monitoring: Begin met Content-Security-Policy-Report-Only en een ruim beleid zoals default-src * met reporting ingeschakeld. Analyseer enkele weken alle rapporten om te zien welke bronnen je website gebruikt.
  2. Identificeer alle bronnen: Maak een inventarisatie van alle externe scripts, stylesheets, afbeeldingen, fonts en API's die je website gebruikt. Vergeet niet analytics, advertising, social media widgets en CDN's.
  3. Verfijn geleidelijk: Maak het beleid stap voor stap strikter. Begin met het toestaan van specifieke vertrouwde domeinen en verwijder geleidelijk wildcards en 'unsafe' directives.
  4. Test grondig: Test alle functionaliteit in verschillende browsers en apparaten voordat je naar enforcement-modus overschakelt.
  5. Blijf monitoren: Ook na implementatie is het belangrijk om rapporten te blijven analyseren voor nieuwe issues of aanvalspogingen.

Voor inline scripts en styles kun je overwegen om nonces of hashes te gebruiken in plaats van 'unsafe-inline', wat veiliger is.

Voor een solide basis-beveiligingsniveau zijn de volgende CSP-directives essentieel:

  • default-src 'self': Dit is je vangnet dat alle niet-gespecificeerde content-types beperkt tot je eigen domein. Begin hier altijd mee als basis.
  • script-src: De belangrijkste directive voor XSS-preventie. Specificeer exact welke JavaScript-bronnen toegestaan zijn. Vermijd 'unsafe-inline' en 'unsafe-eval' waar mogelijk en gebruik in plaats daarvan nonces of hashes.
  • object-src 'none': Blokkeert plugins zoals Flash, wat een veelvoorkomende aanvalsvector is. Tenzij je specifiek plugins nodig hebt, zet dit altijd op 'none'.
  • base-uri 'self': Voorkomt dat aanvallers de base-tag kunnen manipuleren om relatieve URLs te kapen.
  • frame-ancestors 'self': Beschermt tegen clickjacking door te bepalen wie je pagina in een frame mag laden.
  • upgrade-insecure-requests: Dwingt HTTPS af voor alle requests, wat mixed content voorkomt.

Een goed startpunt voor een basis-CSP is: default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; upgrade-insecure-requests;

Breid dit uit met specifieke directives voor externe bronnen die je vertrouwt, zoals CDN's of analytics-platforms.

Auteur & updates

Auteur: Wouter
Publicatiedatum: 16-02-2026
Laatste update: 16-02-2026