Deel 3 van de serie "EU-webbeveiliging: in 10 stappen naar een betere rating"
Waarom CSP belangrijk is
Cross-Site Scripting (XSS) is al meer dan 20 jaar de meest voorkomende kwetsbaarheid in webapplicaties. Een aanvaller injecteert JavaScript in uw website — via een formulier, een URL-parameter, een reactie. De browser van de bezoeker voert de code uit omdat deze geen onderscheid kan maken met legitieme pagina-inhoud.
Content Security Policy (CSP) lost dit op: u definieert expliciet welke bronnen de browser mag accepteren voor scripts, stijlen, afbeeldingen en andere resources. Al het andere wordt geblokkeerd.
Adoptiegraad in de EU: 10,8%. Negen van de tien websites hebben geen CSP-header.
Wat de data laat zien
Uit de SiteGuardian Benchmark over meer dan 700.000 Europese websites:
- 10,8% heeft een CSP-header
- Websites met security.txt hebben CSP in 47% van de gevallen — 4,7x vaker
- Permissions-Policy (gerelateerde header): slechts 6,4%
CSP stap voor stap implementeren
Het grootste obstakel: een te strenge CSP breekt de site. Google Analytics laadt niet meer, ingesloten YouTube-video's verdwijnen, inline stijlen werken niet meer.
Stap 1: Report-Only modus (breekt niets)
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
De browser meldt schendingen maar blokkeert niets. U ziet welke externe bronnen uw site gebruikt zonder iets te breken.
Stap 2: bronnen identificeren
Monitor de rapporten gedurende 1-2 weken. Typische bronnen die u moet toestaan:
- Google Analytics:
https://www.googletagmanager.com https://www.google-analytics.com - Google Fonts:
https://fonts.googleapis.com https://fonts.gstatic.com - YouTube-embeds:
https://www.youtube.com https://www.youtube-nocookie.com - Uw CDN:
https://cdn.uw-domein.com
Stap 3: het beleid opbouwen
Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src 'self' data: https:; frame-src https://www.youtube-nocookie.com
Stap 4: activeren
Verwijder -Report-Only uit de headernaam. Test de site grondig.
Belangrijke richtlijnen
| Richtlijn | Bepaalt | Aanbeveling |
|---|---|---|
default-src |
Fallback voor alles | 'self' |
script-src |
JavaScript | 'self' + expliciete domeinen |
style-src |
CSS | 'self' 'unsafe-inline' (vaak nodig) |
img-src |
Afbeeldingen | 'self' data: https: |
font-src |
Lettertypen | 'self' + Google Fonts indien nodig |
connect-src |
XHR/Fetch | 'self' + API-domeinen |
frame-src |
iframes | Alleen expliciete domeinen |
object-src |
Flash/Java | 'none' (altijd) |
base-uri |
base-tag | 'self' |
Nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'" always;
Apache
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://www.googletagmanager.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; object-src 'none'; base-uri 'self'"
Veelgemaakte fouten
1. unsafe-inline voor scripts. script-src 'unsafe-inline' staat elk inline script toe — waardoor de hele CSP nutteloos wordt tegen XSS. Gebruik nonces of hashes in plaats daarvan.
2. * als bron. default-src * staat alles toe van overal. Dat is geen beleid, dat is een placebo.
3. Te streng beginnen. Begin altijd met Report-Only. Een CSP die de site breekt en onmiddellijk wordt uitgeschakeld, beschermt niemand.
Regelgevende context
- NIS2 Art. 21(2)(d) — beveiliging bij de ontwikkeling en het onderhoud van informatiesystemen
- AVG Art. 32 — XSS kan leiden tot datalekken (sessiekaping, cookiediefstal)
- PCI DSS 4.0 — Vereiste 6.4.3 schrijft expliciet CSP voor op betaalpagina's
Controleer uw CSP
SiteGuardian detecteert niet alleen of een CSP-header bestaat, maar analyseert de richtlijnen op bekende zwaktes:
Volgende week in Deel 4: DNSSEC — waarom 84% van de EU-domeinen geen bescherming heeft tegen DNS-spoofing.