Eine sauber definierte Content-Security-Policy (CSP) gehört zu den wirksamsten Maßnahmen gegen Cross-Site-Scripting (XSS) und Dateninjektion. Mit diesem Werkzeug bauen Sie den Header Schritt für Schritt auf, wenden Presets für gängige Dienste wie Google AdSense, Analytics oder Stripe an und exportieren die Konfiguration direkt für Nginx, Apache oder Cloudflare Workers.
Ein Validator prüft die Richtlinie in Echtzeit und weist auf riskante Einstellungen wie 'unsafe-inline' oder 'unsafe-eval' hin, bevor sie in Produktion gelangen.
Was ist die Content-Security-Policy und warum ist sie wichtig?
Die Content-Security-Policy (CSP) ist ein HTTP-Antwort-Header, mit dem ein Server dem Browser mitteilt, aus welchen Quellen Skripte, Stylesheets, Bilder, Schriftarten, Frames und Netzwerkverbindungen einer Seite geladen werden dürfen. Gelingt es einem Angreifer, Code in das HTML einzuschleusen, etwa über eine Cross-Site-Scripting-Schwachstelle (XSS), blockiert der Browser alles, was die Richtlinie nicht erlaubt. Die CSP ersetzt weder die Validierung von Eingaben noch das korrekte Escaping von Ausgaben auf dem Server, begrenzt aber den Schaden von Fehlern, die diesen Maßnahmen entgehen, erheblich.
So wertet der Browser eine Richtlinie aus
Jeder Ressourcentyp wird von einer eigenen Direktive gesteuert. Fehlt diese, greift der Browser auf default-src zurück. Vereinfacht gilt für jede Ressource:
erlaubt = Quelle ∈ Liste(spezifische Direktive), wenn die Direktive definiert ist.erlaubt = Quelle ∈ Liste(default-src), wenn die spezifische Direktive fehlt.- Gibt es keine anwendbare Richtlinie, ist die Ressource uneingeschränkt erlaubt.
Drei Direktiven erben nicht von default-src: base-uri, form-action und frame-ancestors. Werden sie nicht gesetzt, bleiben sie unbeschränkt. Erhält eine Seite mehrere Richtlinien (etwa einen Header und ein Meta-Tag), gelten alle, und eine Ressource wird nur geladen, wenn sie jede einzelne erfüllt; das Ergebnis entspricht der Schnittmenge der Richtlinien.
Direktiven, die dieses Werkzeug konfiguriert
default-src: Rückfallrichtlinie für alle Ressourcentypen ohne eigene Direktive.script-src: steuert JavaScript und ist die wichtigste Direktive gegen XSS.style-src: Stylesheets und Inline-Style-Blöcke.img-srcundfont-src: Bilder und Schriftarten.connect-src: Ziele vonfetch, XHR, WebSocket und Ähnlichem.frame-srcundframe-ancestors: welche Inhalte Ihre Seite einbetten darf und wer Ihre Seite einbetten darf (Schutz vor Clickjacking).object-src,base-uriundform-action: schließen klassische Injektionswege über Plugins,<base>-Tags und Formulare.
Quellentypen
'none': erlaubt nichts. Der richtige Wert fürobject-src.'self': nur derselbe Ursprung (Schema, Host und Port).- Konkrete Hosts wie
https://js.stripe.com: die empfohlene Variante für Drittanbieter. https:oder*: zu weit gefasst, erlaubt das Laden von nahezu jeder Website.'nonce-…'und'sha256-…': erlauben einzelne Inline-Skripte, ohne'unsafe-inline'zu verwenden.'strict-dynamic': vertraut Skripten, die von einem bereits per Nonce oder Hash erlaubten Skript nachgeladen werden.
Weitere Sicherheits-Header, die Sie ausrollen sollten
Strict-Transport-Security (HSTS) zwingt den Browser zur Nutzung von HTTPS. Der übliche Wert von einem Jahr ergibt sich aus max-age = 365 × 24 × 3600 = 31536000 Sekunden. Für die Aufnahme in die Preload-Liste der Browser sind zusätzlich includeSubDomains und preload erforderlich. Setzen Sie das nur um, wenn die gesamte Domain samt Subdomains über HTTPS funktioniert, denn ein Rückbau dauert lange.
X-Frame-Options (DENY oder SAMEORIGIN) schützt ältere Browser vor Clickjacking; frame-ancestors ist der moderne Nachfolger. X-Content-Type-Options: nosniff verhindert, dass der Browser den MIME-Typ einer Antwort umdeutet. Die Permissions-Policy deaktiviert Browserfunktionen wie Kamera, Mikrofon oder Standortfreigabe. Die Referrer-Policy begrenzt, welche Herkunftsinformationen bei ausgehenden Anfragen mitgesendet werden.
Schrittweise Einführung ohne Produktionsausfall
- Aktivieren Sie den Report-Only-Modus: Der Header
Content-Security-Policy-Report-Onlymeldet Verstöße, ohne etwas zu blockieren. - Werten Sie die Browserkonsole und die eingehenden Berichte aus und ergänzen Sie nur die legitimen Quellen, die fehlen.
- Entfernen Sie
'unsafe-inline'und'unsafe-eval', indem Sie sie durch Hashes oder Nonces ersetzen und davon abhängigen Code überarbeiten. - Wechseln Sie zum Header
Content-Security-Policyim Erzwingungsmodus und lassen Sie das Monitoring aktiv.
Praxisbeispiele
- Content-Website mit AdSense und Analytics: Die Presets ergänzen die benötigten Google-Hosts. Die Initialisierungs-Snippets sind Inline-Code, daher empfiehlt sich der Start im Report-Only-Modus.
- Online-Shop mit Stripe: Das Preset erlaubt
js.stripe.cominscript-srcundframe-srcsowieapi.stripe.cominconnect-src. - Internes SaaS-Dashboard: Eine strikte Richtlinie mit
default-src 'self',frame-ancestors 'none'und HSTS verkleinert die Angriffsfläche und erleichtert Sicherheitsaudits. - Statische Website hinter Cloudflare: Das Ergebnis lässt sich als Cloudflare Worker exportieren, der allen Antworten die Header hinzufügt, ohne den Ursprungsserver anzufassen.
Häufige Fehler
https:inscript-srczu verwenden und das für sicher zu halten: Es erlaubt Skripte von jedem HTTPS-Host.- Öffentliche CDNs zuzulassen, die von Dritten kontrollierbare Inhalte ausliefern und zur Umgehung der Richtlinie dienen können.
base-uri,object-srcundform-actionzu vergessen, die nicht vondefault-srcerben oder Vektoren offen lassen.- Sich beim Meta-Tag auf alles zu verlassen: Es unterstützt weder
frame-ancestorsnochreport-uriodersandbox.