Skip to main content
Terug naar Kennis Hub

Wat is een Content Security Policy (CSP)?

Content Security Policy (CSP) is een browserbeveiligingsfunctie die bepaalde soorten browsergebaseerde aanvallen beperkt, zoals cross-site scripting.

Oct 20, 2025
Wat is een Content Security Policy (CSP)?

Een Content Security Policy (CSP) is een HTTP-responseheader die de browser vertelt uit welke bronnen een pagina scripts, styles, afbeeldingen en verbindingen mag laden. Alles wat niet op die allowlist staat, wordt geblokkeerd voordat het wordt uitgevoerd. Gestandaardiseerd door het W3C is CSP de belangrijkste browser-native verdediging tegen cross-site scripting (XSS) en script-injectie.

Kort samengevat: wat is CSP

  • CSP werkt door een allowlist per resourcetype te declareren (script-src, img-src, connect-src, enz.). Alles wat niet op de lijst staat wordt door de browser geblokkeerd voordat het wordt uitgevoerd.
  • Het wordt geleverd als een HTTP-responseheader of een <meta>-tag in de <head> van de pagina, en met Report-Only-modus test je een policy zonder de site te breken.
  • CSP is een basis, geen volledige verdediging. Het bepaalt waar een script vandaan laadt, niet wat het script doet zodra het draait, dus een gecompromitteerd maar toegestaan domein wordt nog steeds uitgevoerd.
  • CSP alleen is niet genoeg voor PCI DSS 4.0.1-compliance. Eis §6.4.3 vereist script-inventaris en autorisatie; §11.6.1 vereist tamperdetectie. Beide gaan verder dan wat CSP kan afdwingen, vooral tegen een gecompromitteerd toegestaan domein zoals bij het Polyfill.io-incident van 2024.

Waar staat CSP voor?

CSP staat voor Content Security Policy. Het is een HTTP-response header (ook in te stellen via een <meta>-tag in de <head> van de pagina) die de browser vertelt welke bronnen van scripts, stijlen, afbeeldingen en verbindingen een pagina mag laden, en alles wat niet op die allowlist staat blokkeert voordat het wordt uitgevoerd.

Content Security Policy (CSP) begrijpen

Content Security Policy (CSP) is een browserbeveiligingsfunctie die is geïmplementeerd om bepaalde soorten browsergebaseerde aanvallen te beperken, zoals cross-site scripting. De CSP is gestandaardiseerd door het World Wide Web Consortium (W3C) in de CSP Level 3-specificatie. Het stelt een website in staat om een set regels te sturen (via HTTP-response headers of <meta>-tags in de HTML <head>) die de browser instrueren welke contentbronnen zijn toegestaan.

Deze regels, directives genoemd, specificeren goedgekeurde origins voor scripts, afbeeldingen, stijlen, iframes en meer. Het primaire doel van CSP is volledige controle te hebben over waar scripts vandaan worden geladen, samen met controle over welke scripts een pagina mag uitvoeren, om zo te proberen geïnjecteerde of ongeautoriseerde scripts tegen te houden.

Bijvoorbeeld, een CSP-directive kan bepalen dat scripts alleen mogen laden vanaf het eigen domein van de site (met ‘self’), of vanaf specifieke vertrouwde domeinen. De browser blokkeert dan elk scriptbestand of inline script dat niet van een toegestane bron komt. Dit beschermt tegen XSS-aanvallen, waarbij een aanvaller probeert kwaadaardige <script>-tags of code in een site te injecteren. Tegenwoordig ondersteunen de meeste browsers ook de ‘Report-only’-modus van CSP. Hiermee kunnen ontwikkelaars een policy veilig testen. Indien ingeschakeld, worden policy-overtredingen gelogd naar een rapportage-endpoint in plaats van direct te worden geblokkeerd. Dit is een best practice bij het voor de eerste keer implementeren van CSP.

Hoe Content Security Policy (CSP) werkt

Een Content Security Policy wordt aan een browser geleverd via de HTTP-response header genaamd Content-Security-Policy, of via een meta tag in de HTML <head>. De policy bestaat uit directives gescheiden door puntkomma’s, en elke directive controleert een specifiek type bron.

  • ‘script-src’ self: staat alleen scripts toe van dezelfde origin. Elk <script> van een ander domein (of inline scriptcode) wordt geblokkeerd door de browser.
  • ‘connect-src’ self https://api.domain.com : staat AJAX/XHR/fetch-aanroepen alleen toe naar dezelfde site of naar het vertrouwde domein api.domain.com. Dit voorkomt dat kwaadaardige code data exfiltreert naar onbekende servers vanaf de site.
  • img-src ‘self’ data: kan worden gebruikt om alleen afbeeldingen van dezelfde site te laden en externe afbeeldingen te blokkeren - wat kan worden gebruikt om datalekken via afbeeldingsverzoeken te voorkomen.

CSP-nonces en CSP-hashes

CSP ondersteunt ook geavanceerde mechanismen zoals nonces (‘nonce-abc123’) en hashes (‘sha256-xyz…’). Deze stellen inline scripts in staat veilig uit te voeren door cryptografisch hun integriteit te bewijzen. In plaats van alle inline code te verbieden, kunnen ontwikkelaars selectief specifieke scripts autoriseren. Dit verbetert de flexibiliteit zonder in te leveren op beveiliging.

Er zijn talloze andere directives die kunnen worden gebruikt voor andere datatypen zoals media, fonts, iframes, etc., maar de kerngedachte van een Content Security Policy is het whitelisten van vertrouwde bronnen. Wanneer de browser een pagina laadt en bepaalt welke content geladen moet worden, raadpleegt deze eerst de CSP en dwingt deze regels af bij elke laadactie. Elk script of elke bron die deze policy overtreedt, wordt niet geladen. Voor een gedetailleerde implementatiegids, bekijk de OWASP CSP Cheat Sheet.

Veelvoorkomende CSP-directives en hun doel

DirectiveDoelTypisch gebruik
default-srcStelt een basisbeleid in voor alle bronnen wanneer geen andere regel van toepassing is.Begin strikt: default-src 'none';
script-srcBepaalt welke JavaScript-bronnen zijn toegestaan.Whitelist 'self', CDN’s, of gebruik nonce/hash-gebaseerde scripts.
style-srcBeperkt waar CSS vandaan mag laden.Gebruik 'self'; vermijd 'unsafe-inline' waar mogelijk.
img-srcDefinieert vertrouwde afbeeldingsbronnen.Voorkom datalekken via externe afbeeldingsaanroepen.
connect-srcBeperkt AJAX-, fetch- en WebSocket-bestemmingen.Blokkeer data-exfiltratie naar onbekende domeinen.
frame-ancestorsSpecificeert welke sites je pagina’s mogen embedden in iframes.Voorkom clickjacking: frame-ancestors 'none';
report-uri / report-toDefinieert waar CSP-overtredingsrapporten naartoe worden gestuurd.Log en analyseer CSP-schendingen voor policy-afstemming.

CSP-headervoorbeelden die je vandaag kunt kopiëren

Hieronder staan copy-paste startpunten voor de meest voorkomende CSP-implementaties. Test eerst in de modus Content-Security-Policy-Report-Only, kijk in de rapporten naar legitieme scripts die geblokkeerd zouden worden, en schakel dan over naar afdwingmodus.

1. Strikt startbeleid (standaard weigeren + allowlist)

Content-Security-Policy:
  default-src 'none';
  script-src 'self' https://cdn.example.com;
  style-src 'self' 'unsafe-inline';
  img-src 'self' data: https:;
  connect-src 'self' https://api.example.com;
  font-src 'self' https://fonts.gstatic.com;
  form-action 'self';
  frame-ancestors 'none';
  base-uri 'self';
  upgrade-insecure-requests;
  report-uri /csp-report;
  report-to csp-endpoint;

2. Op nonce gebaseerde inline scripts

Content-Security-Policy: script-src 'nonce-r@nd0mNonceHere' 'strict-dynamic';
<script nonce="r@nd0mNonceHere">
  // this script executes; anything without the matching nonce does not
</script>

3. Op hash gebaseerde inline scripts

Content-Security-Policy: script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8=';

Genereer de hash met: echo -n "your inline script contents" | openssl dgst -sha256 -binary | openssl base64

4. Report-Only-modus (geen blokkering, alleen monitoring)

Content-Security-Policy-Report-Only:
  default-src 'self';
  script-src 'self' https://cdn.example.com;
  report-to csp-endpoint;

5. Report-To endpoint (moderne rapportage)

Report-To: {"group":"csp-endpoint","max_age":10886400,"endpoints":[{"url":"https://example.com/csp-report"}]}
Content-Security-Policy: default-src 'self'; report-to csp-endpoint;

6. Voorbeeld van een overtredingspayload

{
  "csp-report": {
    "document-uri": "https://example.com/checkout",
    "referrer": "",
    "violated-directive": "script-src 'self'",
    "effective-directive": "script-src",
    "original-policy": "default-src 'self'; report-uri /csp-report",
    "disposition": "enforce",
    "blocked-uri": "https://malicious.example/skimmer.js",
    "line-number": 42,
    "source-file": "https://example.com/checkout",
    "status-code": 200,
    "script-sample": ""
  }
}

7. Express.js-middleware

app.use((req, res, next) => {
  res.setHeader(
    "Content-Security-Policy",
    "default-src 'self'; script-src 'self' https://cdn.example.com; report-uri /csp-report",
  );
  next();
});

app.post("/csp-report", express.json({ type: "application/csp-report" }), (req, res) => {
  console.log("CSP violation", req.body);
  res.sendStatus(204);
});

8. Cloudflare Worker

export default {
  async fetch(request, env) {
    const response = await fetch(request);
    const headers = new Headers(response.headers);
    headers.set(
      "Content-Security-Policy",
      "default-src 'self'; script-src 'self' https://cdn.example.com; report-to csp-endpoint",
    );
    return new Response(response.body, { status: response.status, headers });
  },
};

Uitgebreide directive-referentie

Naast de zeven directives hierboven definieert CSP er nog meer die opduiken bij productie-hardeningswerk:

DirectiveDoel
strict-dynamicVertrouwt scripts die geladen worden door een reeds vertrouwd (nonce of hash) script. Vereenvoudigt het laden via CDN’s.
upgrade-insecure-requestsUpgradet http:-subresources automatisch naar https:. Elimineert mixed-content-waarschuwingen.
require-trusted-types-forHandhaaft Trusted Types op gevaarlijke DOM-sinks (bv. innerHTML, Function()).
sandboxPast iframe-achtige sandboxing toe op de hele pagina. Krachtig, vereist zorgvuldig testen.
form-actionBeperkt waar <form>-submissies naartoe mogen POSTen. Blokkeert phishing-redirects.
base-uriVergrendelt het <base>-element op specifieke origins. Voorkomt <base>-injectie-aanvallen.
manifest-srcBepaalt van waaruit een web-app-manifest geladen mag worden.
media-srcBeperkt <audio>- en <video>-bronnen.
object-srcBeperkt <object>, <embed>, <applet>. Zet op 'none' op moderne sites.
worker-srcBeperkt Web Worker- en Service Worker-bronnen.

Pas op met 'unsafe-inline' en 'unsafe-eval'. Beide worden nog ondersteund maar schakelen het grootste deel van de CSP-bescherming tegen XSS uit. 'strict-dynamic' met nonces is het moderne vervangingspad.

Zie het op je eigen site

CSP is één laag van client-side-verdediging, en een kritieke laag voor PCI DSS 4.0.1-compliance. Maar CSP alleen stopte de Polyfill.io-aanval in 2024 niet, omdat het gecompromitteerde domein op de allowlist stond. cside legt script-inventaris en payload-analyse bovenop CSP om dat gat te dichten. Gratis niveau beschikbaar.

Hoe voorkomt CSP browsergebaseerde aanvallen?

Beperking van XSS-aanvallen

Bij een cross-site scripting aanval, oftewel een XSS-aanval, vindt een aanvaller over het algemeen een manier om kwaadaardige JavaScript-code in je pagina te injecteren en uit te voeren (bijvoorbeeld via een niet-gesaniteerde input). Standaard blokkeert een CSP alle inline scripts op de pagina, tenzij een policy-directive dit expliciet toestaat. Dit betekent dat als een aanvaller iets als <script>evilCode()</script> in een pagina injecteert, dit niet wordt uitgevoerd (tenzij ‘unsafe-inline’ is toegestaan in de CSP!)

Blokkeren van ongeautoriseerde third-party scripts

Veel sites hebben third-party scripts voor zaken als analytics, gebruikerstracking en advertenties. Met een CSP kunnen site-eigenaren beperken welke externe sites daadwerkelijk scripts mogen leveren. Bijvoorbeeld, als je alleen content wilt serveren vanaf analytics._example_.com en niets anders van example.com, kan de script-src-directive van de CSP van je site expliciet alleen dat toestaan.

Voorkomen van data-exfiltratie

Zoals eerder genoemd, kan een CSP acties op een pagina beperken die gebruikt kunnen worden om te voorkomen dat kwaadaardige JavaScript-code data terugstuurt naar een door een aanvaller gecontroleerd domein. Het gebruik van de connect-src-directive blokkeert netwerkverzoeken naar ongeautoriseerde servers, en kan worden gecombineerd met de form-action-directive om te verzekeren dat data alleen naar jouw domein wordt gestuurd.

Afdwingen van veilige browserpraktijken

Een CSP heeft directives om veilig gedrag af te dwingen dat de beveiliging van je site in het algemeen verbetert.

  • Een voorbeeld hiervan is upgrade-insecure-requests, die de browser dwingt alle bronnen via HTTPS te laden, waardoor gemengde en onveilige content wordt voorkomen.
  • Een andere directive is frame-ancestors, die clickjacking-aanvallen kan voorkomen door niet toe te staan dat je pagina wordt geëmbed in een door een aanvaller gecontroleerd frame.

Gecombineerd resulteren deze policies in een robuuste client-side basis voor moderne webapplicaties.

Beveiligingsbeperkingen van CSP

Het gebruik van een Content Security Policy biedt sterke bescherming, maar het is geen allesomvattende oplossing voor je site, zoals belicht in ons artikel “Waarom Content Security Policy niet werkt”.

Policies kunnen na verloop van tijd afdrijven, en allowlists inspecteren geen codegedrag. Elke grote browser implementeert CSP op zijn eigen, licht verschillende manier. Chrome, Firefox, Safari en Edge ondersteunen allemaal CSP Level 3; rapportagegedrag en overtredingsformaten kunnen variëren. Om je policy te valideren en te onderhouden, test deze regelmatig met browser developer tools en geautomatiseerde scanners zoals Mozilla Observatory of SecurityHeaders.io.

Het combineren van een CSP met een actieve client-side beveiligingslaag zoals cside om real-time inspectie en blokkering toe te voegen aan third-party scripts op je site geeft je een uitstekende verdedigingslaag, met gemoedsrust voor je klanten. Vanuit governance-perspectief verbetert het documenteren van CSP-updates en het monitoren van overtredingsrapporten de controleerbaarheid en langetermijncompliance met frameworks zoals ISO 27001 en OWASP ASVS.

Werkt CSP voor PCI DSS 6.4.3-compliance?

Onder PCI DSS 4.0.1 Vereiste 6.4.3 moeten merchants bewijzen dat elk client-side script is geautoriseerd en de integriteit van scripts aantonen. CSP en SRI brengen je een deel van de weg. CSP beperkt welke domeinen scripts mogen laden, en SRI controleert of de code van een bestand niet is veranderd. Maar samen zijn ze een statische oplossing voor een dynamisch probleem. Dynamische scripts worden bijgewerkt en hashes breken daardoor. Handmatig onderhoud van CSP-lijsten is vrijwel onmogelijk.

De meeste moderne sites gebruiken dynamische third-party scripts, dus deze controles verslechteren snel. Deze aanpak zal doorgaans tekortschieten in het vereiste bewijs voor PCI 6.4.3.

Een Content Security Policy (CSP)-voorbeeld: toen een strikte CSP de productie brak

De dag dat de checkout stopte met werken: hoe een strikte CSP productie brak

Het begon allemaal met een gewone nieuwe deployment. Niets bijzonders, gewoon een nieuwe Content Security Policy om een webwinkel veiliger te maken en aanvallers te verhinderen stiekem kwaadaardige code binnen te smokkelen.

De schone default-src ‘none’ was ingesteld zonder testen. En dus, op het moment dat de CSP werd geactiveerd, blokkeerde de website diensten die het eigenlijk nodig had. Analytics stopte met werken en, erger nog, het betalingssysteem werd geblokkeerd. Klanten konden hun bestellingen niet afronden en het checkout-systeem brak. Ontwikkelaars gingen aan het werk en schakelden de header om naar Content-Security-Policy-Report-Only en verzamelden overtredingslogs. Van daaruit bouwden ze een allowlist (script-src ‘self’ https://pay.examplecase.com) met alle diensten die de webshop nodig had om goed te functioneren.

Na het verfijnen van de CSP kon het team zonder problemen deployen. Dit soort onoplettendheid is een veelvoorkomend probleem wanneer teams CSP intern beheren. Het vergeten om een nieuw marketingscript te whitelisten, technische misconfiguraties, of problemen met dynamische scripts die hashingprotocollen breken, maken CSP een nachtmerrie om op schaal te beheren.

Genereer en onderhoud je CSP automatisch met cside

Een Content Security Policy met de hand schrijven en onderhouden is waar de meeste teams vastlopen: elke nieuwe marketingtag, dynamisch script van derden of gewijzigd endpoint van een leverancier kan de policy breken of de allowlist stilletjes verbreden. cside neemt dat handmatige werk weg.

cside kijkt naar de scripts die je site daadwerkelijk laadt en genereert een kant-en-klare CSP-header voor je op basis van echte browsersessies, en houdt die actueel naarmate die scripts veranderen, zodat je niet handmatig achter allowlist-updates hoeft aan te lopen. Je krijgt een Content Security Policy die weerspiegelt wat je site echt uitvoert, plus de scriptinventarisatie en manipulatiedetectie die een CSP alleen niet kan bieden voor de eisen §6.4.3 en §11.6.1 van PCI DSS 4.0.1.

Er valt niets te bouwen. Meld je aan voor het gratis abonnement, voeg je domein toe en cside begint je CSP te genereren op basis van live verkeer. Ontdek de CSP-beheeroplossing of zie hoe cside de gaten dicht die een CSP openlaat.

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

Monitor en beveilig je third-party scripts

Krijg volledig inzicht in en controle over elk script dat aan je gebruikers wordt geleverd om de beveiliging en prestaties van je site te verbeteren.

Start gratis, of probeer Business met een proefperiode van 14 dagen.

cside-dashboardinterface met scriptmonitoring en beveiligingsanalyses

FAQ

Veelgestelde vragen

Inputvalidatie helpt het risico op XSS-injectie te verminderen, maar voorkomt dit niet per se. Een CSP biedt een extra verdedigingslaag door te beperken welke bronnen wel en niet geladen mogen worden op basis van hun herkomst. Dit betekent dat zelfs als er kwaadaardige code doorheen glipt, de browser nog steeds kan voorkomen dat deze wordt uitgevoerd.

Helaas niet. CSP kan het aanvalsoppervlak voor cross-site scripting verkleinen, maar het is geen wondermiddel. Verkeerde configuraties van de CSP, te ruime allowlists, of het gebruik van `unsafe-inline` kunnen je site nog steeds kwetsbaar maken. Veel websites die CSP gebruiken staan googletagmanager.com nog steeds toe op de allowlist, en iedereen kan dat domein gebruiken om code te hosten.

Als deze niet goed wordt geïmplementeerd, kan dat gebeuren. Een CSP kan legitieme bronnen blokkeren, zoals third-party libraries waar je website van afhankelijk is. Daarom is het ook belangrijk om je regels te testen en aan te passen voordat je ze afdwingt.

Onderhoud kan uitdagend zijn, vooral als je site sterk afhankelijk is van dynamische third-party tools. Policies moeten regelmatig worden bijgewerkt naarmate tools veranderen. Je marketingtools zullen je hoogstwaarschijnlijk niet waarschuwen als ze data naar een nieuw endpoint beginnen te sturen. Een dienst zoals cside kan helpen om een deel van het doorlopende onderhoud te verlichten.

Over het algemeen niet, maar er zijn kanttekeningen. De browser controleert simpelweg de bronnen aan de hand van de CSP voordat deze worden geblokkeerd. De impact op de prestaties is verwaarloosbaar vergeleken met de beveiligingsvoordelen die je ervoor terugkrijgt. De zorg zit vooral in de configuratietijd. Wanneer je CSP tot de limiet gebruikt, dus met de volledige CSP-headerlengte, vergroot dit de pakketgrootte aanzienlijk, wat op schaal of voor gebruikers met een lage bandbreedte prestatie-implicaties kan hebben.

Boek een demo

Wil je dit doornemen met een engineer?

Dertig minuten, op je eigen site. Geen slides.

We laten je zien:

Welke scripts van derden er nu op je site draaien
Hoe je ervoor staat op PCI DSS 6.4.3 en 11.6.1
Welk deel van je verkeer uit bots en AI-agents bestaat

Liever gewoon een vraag stellen?

Vrije momenten zoeken…

Alleen echte mensen. Wij merken het.

Lukt het boeken niet? Agenda in een nieuw tabblad openen

Wat wil je oplossen?

Vertel het ons in één zin, dan komen we terug met iets bruikbaars in plaats van een standaardverhaal.

Waar we meestal mee helpen:

Zien welke scripts van derden op je site draaien
Bewijs voor PCI DSS 6.4.3 en 11.6.1
Bots, AI-agents en accountovername

Liever meteen een moment inplannen? Kies een tijdstip