Het beveiligingsteam sluit een audit af met een duidelijke aanbeveling: voer een strikt Content Security Policy in. De ontwikkelaar voegt de header op vrijdagmiddag toe aan de productie. Twintig minuten later laadt de Stripe-kassa niet meer, Google Tag Manager zwijgt en de administratieve backoffice geeft een lege pagina weer. Terugdraaien van de kop, gespannen post-mortem, belofte om “later te hervatten” – wat nooit wordt.
Een goed geleide CSP is geen overstap. Dit is een uitvoerbare witte lijst: de browser voert alleen uit wat u expliciet toestaat voor scripts, stijlen, afbeeldingen, XHR-verbindingen en iframes. Elke marketingpixel, elke webpackbundel, elk betalings-iframe telt – inclusief degene die niemand meer heeft geïnventariseerd sinds de laatste campagne.
De juiste build wordt alleen in rapportage uitgevoerd, met marketing in de lus, een nonce-pijplijn aan de build-kant en een volledige checkout-test voordat wordt overgeschakeld naar afdwingen. Zonder dit straf je de basket, niet de XSS-aanvaller.
Uitrol in vier fasen
Fase 1 — inventarisatie: maak een lijst van alle scripts en stijlen, inclusief de scripts en stijlen die zijn geïnjecteerd door Tag Manager, A/B-testen, chatondersteuning, heatmaps. Exporteer overtredingen vanuit de browser (tabblad Netwerk + console) op kritieke paden: ontvangst, registratie, afrekenen, admin.
Fase 2 — Report-Only twee tot vier weken: header Content-Security-Policy-Report-Only met eindpunt /csp-report of service van derden. Verzamelen, aggregeren op geschonden richtlijn, sorteren: eerst script-src, daarna connect-src, frame-src, img-src.
Fase 3 – oplossingen: nonce per query voor legitieme inline, SHA-256-hash voor statische fragmenten, refactoring naar externe bestanden voor de rest. Elk nieuw marketingdomein doorloopt een CSP-ticket voordat de tag in productie wordt genomen.
Fase 4 – afdwingen met monitoring: schakel over naar ‘Content-Security-Policy’ wanneer kritieke overtredingen gedurende zeven opeenvolgende dagen vrijwel nul zijn. Plan een gedocumenteerde rollback-header (feature flag of nginx-configuratie) en E2E-checkout-test bij het afdwingen van de fasering vóór productie.
Richtlijnen en veelvoorkomende valkuilen
| Richtlijn | Rol | Lopende val |
|---|---|---|
standaard-src | Terugval | Te tolerant verbergt gaten in script-src |
script-src | JavaScript | Vergeet js.stripe.com of GTM |
stijl-src | CSS | Inline React/Vue zonder nonce |
connect-src | ophalen/XHR | Vergeten betalings- of analyse-API |
frame-src | iframes | 3D Secure Stripe geblokkeerd |
img-src | Afbeeldingen | Pixels volgen op onbekend domein |
'strikt-dynamisch' met nonce moderniseert de vertrouwensketen: een nonce-script kan nakomelingen laden - testdoel Safari en Firefox, niet alleen Chrome.
'unsafe-inline' en 'unsafe-eval' zijn alleen acceptabel in korte, gedocumenteerde overgangen. Elke gebeurtenis moet een verwijderingsdatum hebben.
Pijpleiding nonce en bouwen
Het raamwerk genereert een nonce per verzoek (sessie of middleware). De sjabloon injecteert <script nonce="{{nonce}}">. De bouwtool behoudt de tijdelijke aanduiding; minificatie mag deze niet verbreken.
Voor onveranderlijke inline inhoud (erfgoed van fragmentanalyses) berekent u de SHA-256-hash en declareert u 'sha256-…' in script-src. Documenteer de build-opdracht in de bewerkingen README.
CI-staging: geautomatiseerde test of de CSP-header aanwezig is en dat de afrekenpagina wordt geladen zonder consoleschending. Blokkeer samenvoeging bij regressie.
Derde partijen: Stripe, GTM, analyses
Stripe vereist doorgaans script-src js.stripe.com, frame-src hooks.stripe.com, connect-src api.stripe.com. Noem ze expliciet - vertrouw niet alleen op default-src.
Google Tag Manager propageert variabele domeinen: leg een “nieuwe tag = CSP-beoordeling” proces op met een SLA van 48 uur. Anders breekt de maandagcampagne dinsdag.
Voer na elke headerwijziging een volledige afrekenrun uit met testkaart, 3-D Secure indien geactiveerd, en webhookbevestiging aan de serverzijde.
Bestuur en rapportage
Noem een CSP-eigenaar in de beveiligings-RACI-matrix – geen vage commissie. Hij neemt deel aan tagmarketingreleases.
Wekelijkse aggregatie van alleen-rapportrapporten: volume per richtlijn, nieuwe domeinen, toegewezen pagina's. Spike na implementatie = terugdraaien of hotfix, geen stilte.
AVG: CSP-rapporten kunnen URL's met parameters bevatten - filter of anonimiseer vóór langdurige opslag.
Beslis en ga vooruit zonder blinde vlek
- Inventaris van scripts en stijlen — build, inline, Tag Manager, Stripe; eigenaar CSP genoemd in de RACI.
- Alleen rapport 2-4 weken — eindpunt
/csp-reporttarief beperkt, wekelijkse script-src-triage. - Pipeline nonce of CI-hash — fasering afdwingen vóór productie; test afrekenen en WordPress-beheerder.
- Nieuw tagmarketingformulier: script-/connect-/frame-domeinen worden 48 uur vóór publicatie beoordeeld.
- Scorecard afdwingen — nul kritieke overtredingen 7 dagen, gedocumenteerde rollback-header.
Voorkant en CDN: controleer headers via curl -I; vergelijk hosts via de overzicht en de vergelijker.
Veelgestelde vragen
CSP blokkeert wat precies?
Het beperkt uitvoerbare bronnen (scripts, stijlen, verbindingen, frames) om de impact van een XSS-injectie te verminderen. De browser weigert alles wat niet op de witte lijst staat, inclusief een vergeten marketingpixel.
Is Report-Only lang genoeg?
Nee: dit is de inventarisatiefase (minimaal 2-4 weken). Overtredingen moeten op kritieke paden vrijwel nul zijn voordat ze in de productie worden afgedwongen.
Hoe beheer ik inline-scripts?
Drie manieren: unieke nonce per verzoek geïnjecteerd door het raamwerk, SHA-256-hash van statische inhoud, of refactoring naar externe bestanden. unsafe-inline is alleen acceptabel bij korte overgangen.
Bestaan Stripe en Tag Manager naast CSP?
Ja, met script-src en connect-src met vermelding van js.stripe.com, GTM-domeinen en betalings-API's. Test de volledige checkout na elke headerwijziging.
Lees twee weken aan CSP-rapporten voordat u het verbiedt: verrassingen komen van marketing, niet van de backend.
