Die Content-Security-Policy (CSP) ist ein Response-Header, der dem Browser mitteilt, welche Skripte, Styles, Bilder, Frames und Verbindungen eine Seite nutzen darf. Gelingt es jemandem, ein Skript in Ihr HTML einzuschleusen, verhindert eine gute Policy, dass der Browser es ausführt. Aus Foren kopierte Policies scheitern meist auf eine von zwei Arten: Sie legen Analytics, Webfonts und das Zahlungs-Widget lahm, oder sie werden so lange mit 'unsafe-inline' und Platzhaltern aufgefüllt, bis sie fast alles erlauben.
Dieser Leitfaden zeigt funktionierende Beispiele für drei Arten von Websites, erklärt, was eine Policy strikt macht (Nonces, Hashes und 'strict-dynamic'), behandelt die Direktiven, die default-src nicht erreicht, zeigt, wie Sie Verstoßberichte sammeln, und beschreibt eine Einführung, die im Report-Only-Modus beginnt, damit nichts ohne Vorwarnung kaputtgeht. Alle Beispiele verwenden example.com; ersetzen Sie die Platzhalter durch Ihre eigenen Werte.
Was dieser Leitfaden abdeckt
Der kostenlose Checker liest die Header einer öffentlichen Antwort: der Startseite des eingegebenen Origins nach bis zu fünf Weiterleitungen. Er liest nur den durchgesetzten CSP-Header, keine Report-Only-Policy, bewertet nicht, ob die Policy zu Ihrer Website passt, und ist kein Penetrationstest.
1. Was eine Content-Security-Policy leistet und was nicht
Eine Policy ist eine Liste von Direktiven, getrennt durch Semikolons. Jede Direktive nennt einen Ressourcentyp und die dafür erlaubten Quellen: script-src für JavaScript, style-src für CSS, img-src, font-src, connect-src für Fetch-, XHR- und WebSocket-Verbindungen sowie frame-src für Frames, die die Seite einbettet. default-src dient als Rückfallwert für diese Fetch-Direktiven, wenn eine bestimmte fehlt (W3C CSP Level 3).
Drei wichtige Direktiven greifen nicht auf default-src zurück: frame-ancestors (welche Websites Ihre Seite in einen Frame laden dürfen), base-uri (was ein <base>-Element setzen darf) und form-action (wohin Formulare senden dürfen). Eine Policy, die nur default-src 'self' enthält, lässt also weiterhin zu, dass jede Website Ihre Seite einbettet und ein eingeschleustes <base>-Tag relative URLs umleitet.
Quellangaben gibt es in drei Formen:
- Schlüsselwörter in einfachen Anführungszeichen:
'self'(der eigene Origin der Seite),'none'(nichts),'unsafe-inline','unsafe-eval'und'strict-dynamic'. - Hosts und Schemata:
https://cdn.example.com,https://*.example.com,https:oderdata:. - Nonces und Hashes:
'nonce-…'und'sha256-…', die einzelne Script- oder Style-Elemente freigeben statt ganzer Hosts.
Senden Sie die Policy als HTTP-Header. Ein <meta http-equiv="Content-Security-Policy">-Tag funktioniert für die meisten Direktiven, doch die Spezifikation schließt dort frame-ancestors, report-uri und sandbox aus, und eine Report-Only-Policy lässt sich per Meta-Tag überhaupt nicht ausliefern (MDN-Leitfaden zur CSP). Bleiben Sie realistisch: Eine CSP begrenzt, was eingeschleuster Code anrichten kann. Sie ersetzt weder das Escaping von Ausgaben noch die Validierung von Eingaben, die die Einschleusung von vornherein verhindern.
2. Drei Content-Security-Policy-Beispiele als Ausgangspunkt
Beispiel A: eine Website ohne Skripte von Drittanbietern. Eine Allowlist-Policy funktioniert, wenn jedes Skript und jedes Stylesheet als Datei auf Ihrem eigenen Origin liegt:
Content-Security-Policy: default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; upgrade-insecure-requestsSie blockiert jedes Inline-<script>, jedes style-Attribut und alles, was von anderen Hosts kommt. Damit passt sie zu handgebauten oder statisch generierten Websites ohne Einbettungen.
Beispiel B: eine serverseitig gerenderte Website mit Nonce. Das ist die strikte Policy, die web.dev für Seiten empfiehlt, die der Server pro Anfrage erzeugt, ergänzt um Frame-Schutz:
Content-Security-Policy: script-src 'nonce-R4nd0mBase64Value' 'strict-dynamic'; object-src 'none'; base-uri 'none'; frame-ancestors 'self'Die Nonce ändert sich mit jeder Antwort (Abschnitt 3). Beachten Sie, was fehlt: Ohne default-src bleiben Styles, Bilder, Fonts und Verbindungen unbeschränkt. Das ist ein bewusster Kompromiss: Die Policy konzentriert sich auf die Ausführung von Skripten, wo Cross-Site-Scripting den größten Schaden anrichtet, und vermeidet Hostlisten, die bei jedem Domainwechsel eines Anbieters brechen.
Beispiel C: statische oder gecachte Seiten mit Hashes. Wenn alle Besucher dasselbe HTML erhalten, geben Sie Inline-Skripte über ihren Hash frei:
Content-Security-Policy: script-src 'sha256-BASE64_HASH_OF_INLINE_LOADER' 'strict-dynamic'; object-src 'none'; base-uri 'none'; frame-ancestors 'self'| Policy-Typ | Passt zu | Laufender Aufwand | Achten Sie auf |
|---|---|---|---|
| A: Host-Allowlist | Statische Websites ohne Drittanbieter-Code | Hostliste bei jedem neuen Anbieter anpassen | Jedes Skript auf einem erlaubten Host ist ladbar, auch alte Bibliotheksversionen auf einem gemeinsam genutzten CDN |
| B: Nonce + strict-dynamic | Seiten, die Ihre Anwendung pro Anfrage rendert | Nonce in jedes Script-Tag der Templates schreiben | Seiten-Caches, die allen Besuchern dieselbe Nonce ausliefern |
| C: Hash + strict-dynamic | Statisches, vorgerendertes oder am Edge gecachtes HTML | Hashes bei jeder Änderung am Inline-Code neu berechnen | Minifier und Templates, die Leerzeichen und damit den Hash verändern |
Ganz gleich, welche Variante Sie wählen: Ergänzen Sie die Berichtsdirektiven aus Abschnitt 6 und senden Sie die Policy zunächst als Content-Security-Policy-Report-Only.
3. Nonces und Hashes statt 'unsafe-inline'
'unsafe-inline' erlaubt jedes Inline-Skript, auch eines, das ein Angreifer eingeschleust hat, und hebt damit den größten Teil dessen auf, was eine CSP gegen Cross-Site-Scripting leistet. Nonces und Hashes geben nur den Inline-Code frei, den Sie tatsächlich ausliefern wollen. Browser ignorieren 'unsafe-inline' in einer Direktive, die zusätzlich eine Nonce oder einen Hash enthält (MDN). Deshalb kann es in einer strikten Policy als Rückfall für sehr alte Browser stehen bleiben.
Nonces
Eine Nonce ist ein Zufallswert, den der Server für jede Antwort erzeugt, in den Header schreibt und in das nonce-Attribut jedes Skripts kopiert, das ausgeführt werden soll. Sie muss unvorhersehbar und bei jeder Antwort neu sein; web.dev empfiehlt mindestens 128 Bit aus einem kryptografisch sicheren Zufallsgenerator. In einer Node.js-Anwendung:
import crypto from 'node:crypto';
app.use((req, res, next) => {
const nonce = crypto.randomBytes(16).toString('base64');
res.locals.nonce = nonce;
res.setHeader('Content-Security-Policy',
`script-src 'nonce-${nonce}' 'strict-dynamic'; object-src 'none'; base-uri 'none'; frame-ancestors 'self'`);
next();
});Das Template schreibt dann <script nonce="…" src="/app.js"></script> mit demselben Wert. Setzen Sie die Nonce dort, wo Ihre Templates Ihre eigenen Script-Tags erzeugen, und niemals, indem Sie alle <script>-Tags im fertigen HTML umschreiben: Eine pauschale Ersetzung würde auch ein eingeschleustes Skript freigeben. Zwei Fallen sind häufig: Ein CDN oder Seiten-Cache, der das HTML speichert, liefert allen Besuchern dieselbe Nonce aus, und ein Wert, der beim Build in eine statische Datei geschrieben wird, ist keine Nonce.
Hashes
Ein Hash gibt genau ein Inline-Skript frei: den base64-kodierten SHA-256-, SHA-384- oder SHA-512-Hash des Textes zwischen den Script-Tags. Jedes Zeichen zählt, auch Leerzeichen und Zeilenumbrüche, sodass eine Änderung am Minifier oder Template einen neuen Hash ergibt. Darum eignen sich Hashes besser für statische und gecachte Seiten, deren Inhalt für alle gleich ist. Chrome zeigt in der Konsole den erwarteten Hash an, wenn es ein Inline-Skript blockiert; Sie können ihn auch selbst berechnen:
printf '%s' 'console.log("hello")' | openssl dgst -sha256 -binary | openssl base64Was beide nicht erlauben
Inline-Event-Handler wie onclick="…" und javascript:-URLs blockiert eine Nonce- oder Hash-basierte Policy. Verlagern Sie diesen Code in Skriptdateien und binden Sie ihn mit addEventListener an. 'unsafe-hashes' kann einen bestimmten Handler über seinen Hash erlauben, sollte aber nur eine Übergangslösung sein. Code, der Zeichenketten als Code ausführt, etwa eval(), new Function() oder setTimeout mit einem String, braucht 'unsafe-eval'. Ersetzen Sie ihn, wo es geht, und nutzen Sie das engere 'wasm-unsafe-eval', wenn nur WebAssembly kompiliert werden muss (MDN script-src).
4. strict-dynamic: vertrauenswürdige Skripte laden lassen, was sie brauchen
Auf den meisten Websites laufen Skripte, die weitere Skripte nachladen: Ein Tag-Manager fügt Analytics hinzu, ein Consent-Banner seine Anbieter, ein Chat-Widget sein eigenes Bundle. Jeden Host aufzulisten, den sie verwenden könnten, ist fehleranfällig. 'strict-dynamic' geht einen anderen Weg: Ein per Nonce oder Hash erlaubtes Skript darf weitere Skripte hinzufügen, und auch diese gelten als vertrauenswürdig.
In Browsern, die es unterstützen, sorgt 'strict-dynamic' außerdem dafür, dass Host-Allowlists, 'self' und 'unsafe-inline' in script-src ignoriert werden (MDN). Daraus folgen drei Dinge:
- Jedes
<script>-Tag in Ihrem HTML braucht die Nonce oder einen passenden Hash, auch Skripte vom eigenen Origin, denn'self'gibt sie nicht mehr frei. - Skripte, die ein vertrauenswürdiges Skript mit
document.createElement('script')erzeugt, sind erlaubt. Skripte, die mitdocument.writein die Seite geschrieben werden (vom Parser eingefügte Skripte), sind es nicht; alte Einbettungs-Snippets, die darauf setzen, funktionieren dann nicht mehr. - Vertrauen wird weitergegeben. Alles, was Ihr Tag-Manager lädt, wird ausgeführt. Wer dort veröffentlichen darf, kann also faktisch Code auf Ihrer Website ausführen. Behandeln Sie diesen Zugang wie einen Deployment-Zugang.
Für ältere Browser ergänzen Sie Rückfallwerte, die neuere Browser ignorieren:
script-src 'nonce-R4nd0mBase64Value' 'strict-dynamic' https: 'unsafe-inline'; object-src 'none'; base-uri 'none'Ein Browser mit Unterstützung für CSP Level 3 wendet nur die Nonce und 'strict-dynamic' an. Ein Browser, der Nonces kennt, aber 'strict-dynamic' nicht, nutzt die Nonce und https:, und ein sehr alter Browser fällt auf 'unsafe-inline' https: zurück. Google dokumentiert ein Nonce-fähiges Tag-Manager-Snippet, das die Nonce an die hinzugefügten Skripte weitergibt, und weist darauf hin, dass benutzerdefinierte JavaScript-Variablen im Tag Manager weiterhin 'unsafe-eval' benötigen (CSP-Leitfaden zum Tag Manager).
5. frame-ancestors, object-src 'none' und base-uri: Direktiven, die Sie ausdrücklich setzen sollten
frame-ancestorslegt fest, welche Websites Ihre Seite in einem Frame einbetten dürfen, und schützt so vor Clickjacking. Verwenden Sie'none', wenn niemand die Seite einbetten muss,'self', wenn nur Ihre eigenen Seiten das tun, oder nennen Sie exakte Origins wiehttps://app.example.com. Die Direktive wirkt nur im HTTP-Header.X-Frame-Options(DENYoderSAMEORIGIN) bleibt ein Rückfall für ältere Browser; beide sollten dieselbe Einbettung erlauben (MDN frame-ancestors).object-src 'none'blockiert<object>und<embed>. Plugins gibt es in modernen Browsern nicht mehr, doch diese Elemente können weiterhin Inhalte laden, und eine strikte Policy ohnedefault-srclässt sie unbeschränkt, wenn Sie nichts anderes angeben.base-uri 'none', oder'self', falls Ihre Seiten ein<base>-Element nutzen, verhindert, dass ein eingeschleustes<base href>alle relativen Skript-URLs auf einen fremden Host umleitet.form-action 'self'begrenzt, wohin Formulare senden dürfen. Ergänzen Sie den Origin Ihres Zahlungs- oder Login-Anbieters, falls ein Formular dorthin sendet, und testen Sie diese Abläufe nach der Änderung.upgrade-insecure-requestslässt den Browserhttp://-Unterressourcen über HTTPS laden. Das hilft gegen Mixed Content, ersetzt aber kein HSTS.
Schreiben Sie diese Direktiven ausdrücklich in jede Policy, auch in die Beispiele B und C. Sie erfordern kaum Pflege und schließen Lücken, die die Skriptregeln offenlassen.
6. Verstöße melden mit report-to und report-uri
Verstoßberichte zeigen, was eine Policy in den Browsern echter Besucher blockiert hat oder im Report-Only-Modus blockieren würde. CSP Level 3 definiert report-to, das einen im Header Reporting-Endpoints deklarierten Endpunkt benennt, und erklärt das ältere report-uri, das direkt eine URL erhält, für veraltet. Laut MDN ist report-to seit 2026 in aktuellen Browsern verfügbar, ältere Browserversionen verstehen nur report-uri. Browser mit report-to-Unterstützung ignorieren report-uri, senden Sie also vorerst beides (MDN report-to):
Reporting-Endpoints: csp="https://example.com/csp-reports"
Content-Security-Policy-Report-Only: script-src 'nonce-R4nd0mBase64Value' 'strict-dynamic' 'report-sample'; object-src 'none'; base-uri 'none'; report-uri https://example.com/csp-reports; report-to cspDie beiden Mechanismen senden unterschiedliche Formate. report-uri schickt ein JSON-Objekt mit dem Schlüssel csp-report und dem Content-Type application/csp-report. report-to schickt application/reports+json: eine Liste von Berichten mit dem type csp-violation, deren Body Felder wie documentURL, blockedURL, effectiveDirective und disposition (enforce oder report) enthält. Mit 'report-sample' enthält der Bericht zu blockiertem Inline-Code dessen erste 40 Zeichen. Nehmen Sie beide Formate am selben Endpunkt an.
- Rechnen Sie mit Rauschen. Browsererweiterungen schleusen Skripte ein und lösen Verstöße mit Quelldateien wie
chrome-extension://odermoz-extension://aus. Gruppieren Sie die Berichte nach Direktive und blockiertem Host und achten Sie auf Muster statt auf Einzelfälle. - Behandeln Sie Berichte als personenbezogene Daten. Dokument-URLs und Referrer können Query-Strings mit E-Mail-Adressen oder Tokens enthalten. Entfernen oder kürzen Sie diese, bewahren Sie Berichte nur kurz auf und geben Sie sie nicht ohne Grund weiter.
- Schützen Sie den Endpunkt. Jeder kann gefälschte Berichte senden. Setzen Sie Größen- und Ratenlimits und zeigen Sie Berichtsinhalte in einer Admin-Oberfläche nie unescaped an.
7. Was typischerweise bricht: Analytics, Fonts, Inline-Skripte und Einbettungen
Die meisten Verstöße der ersten Tage stammen aus wenigen Quellen. Das Feld effectiveDirective im Bericht zeigt, welche Regel Sie prüfen sollten:
| Symptom | Direktive im Bericht | Typische Lösung |
|---|---|---|
| Analytics erfasst keine Seitenaufrufe mehr | script-src-elem, connect-src, img-src | Das Tag mit Nonce laden oder seinen Skript-Host erlauben und die vom Anbieter dokumentierten Erfassungs-Hosts freigeben (Google listet sie je Produkt auf) |
| Webfonts fallen auf Systemschriften zurück | font-src, style-src-elem | Den Stylesheet-Host in style-src und den Host der Schriftdateien in font-src erlauben (bei Google Fonts fonts.googleapis.com und fonts.gstatic.com) oder die Dateien selbst hosten |
| Ein Theme- oder CMS-Snippet funktioniert nicht mehr | script-src-elem mit blockedURL „inline“ | Die Nonce im Template setzen, den Code in eine Datei verschieben oder seinen Hash erlauben |
Buttons mit onclick reagieren nicht | script-src-attr | Den Handler mit addEventListener in einer Skriptdatei neu schreiben |
| Benutzerdefinierte Tag-Manager-Variablen liefern nichts | script-src (eval) | Durch integrierte Variablen ersetzen oder 'unsafe-eval' als dokumentierte Ausnahme akzeptieren |
| Ein eingebettetes Video, eine Karte oder ein Zahlungs-Frame bleibt leer | frame-src | Den exakten Origin des Anbieters ergänzen |
| Inline-Styles werden ignoriert, das Layout verrutscht | style-src-elem, style-src-attr | Styles in Stylesheets verschieben, Style-Elementen die Nonce geben oder 'unsafe-inline' nur in style-src als dokumentierte Ausnahme behalten |
| Chat oder Live-Updates bauen keine Verbindung auf | connect-src | Die https://- und wss://-Hosts des Anbieters ergänzen |
| Ihre App oder ein Partner kann die Seite nicht mehr einbetten | frame-ancestors | Die exakten einbettenden Origins auflisten |
Inline-Styles sind ein geringeres Risiko als Inline-Skripte, aber nicht harmlos: Eingeschleustes CSS kann verändern, was Besucher sehen, und über Attributselektoren einzelne Seitendaten nach außen geben. Viele Frameworks und CSS-in-JS-Bibliotheken fügen Style-Elemente zur Laufzeit ein. Prüfen Sie daher, ob Ihres Nonces unterstützt, bevor Sie 'unsafe-inline' aus style-src entfernen. Wer Fonts und Bibliotheken selbst hostet, erledigt mehrere dieser Zeilen auf einmal und hält die Policy kurz.
8. Eine CSP stufenweise einführen
- Bestandsaufnahme. Erfassen Sie Skripte, Styles, Fonts, Frames und Verbindungsziele Ihrer wichtigsten Seiten: Startseite, Login, Kundenkonto, Checkout und Seiten mit eingebetteten Widgets. Das Network-Panel der DevTools und die Konfiguration Ihres Tag-Managers sind die schnellsten Quellen.
- Report-Only. Senden Sie den Entwurf als
Content-Security-Policy-Report-Onlymit aktivierten Berichten. Nichts wird blockiert; Verstöße erscheinen in der Konsole und an Ihrem Endpunkt. Lassen Sie den Modus lange genug laufen, damit auch selten besuchte Seiten und Kampagnen auftauchen, meist eine Woche oder länger. - Die Quellen korrigieren, nicht die Policy. Nonces ergänzen, Inline-Handler in Dateien verschieben, Fonts selbst hosten. Einen Host oder
'unsafe-eval'fügen Sie nur als dokumentierte Ausnahme mit verantwortlicher Person und Begründung hinzu. - Durchsetzen. Ändern Sie den Header-Namen in
Content-Security-Policy. Lassen Sie daneben eine strengere Report-Only-Policy laufen, um die nächste Verschärfung zu testen: Kommen beide Header an, setzt der Browser den einen durch und meldet zum anderen nur. - Dranbleiben. Ein neues Marketing-Tag, ein Plugin-Update oder ein Framework-Upgrade kann neuen Inline-Code mitbringen. Lassen Sie den Berichtsendpunkt aktiv und prüfen Sie den Header nach jeder Änderung an Server, CDN oder Framework erneut.
Zwei Infrastrukturdetails sorgen oft für Überraschungen. Fügt ein CDN oder Framework einen eigenen CSP-Header hinzu, setzt der Browser jede empfangene Policy durch und eine Ressource muss alle bestehen; ein zusätzlicher Header kann also nur verschärfen, nie lockern (MDN). Und wird HTML am Edge gecacht, muss die Nonce dort erzeugt werden, wo die Seite zusammengesetzt wird, oder Sie wechseln zu Hashes. So sehen Sie, was eine Seite wirklich sendet:
curl -sS -D - -o /dev/null https://example.com/ | grep -i content-security-policyDer Leitfaden zum Security Headers Check behandelt die Header, die neben die CSP gehören, und die Sicherheits-Checkliste für den Website-Launch ordnet sie in eine vollständige Prüfung vor dem Livegang ein.
9. Den ausgelieferten Header mit dem kostenlosen Checker prüfen
Sobald die Policy durchgesetzt wird, zeigt der kostenlose Security Headers Checker, was ein Browser von Ihrer Startseite erhält. Er führt den kostenlosen Launch-Readiness-Snapshot von Sitelemetry aus, acht passive Prüfungen an einer öffentlichen Domain ohne Anmeldung, und zeigt die Header-Prüfung geöffnet über den anderen sieben.
- Er ruft die Startseite des eingegebenen Origins ab, folgt bis zu fünf Weiterleitungen und liest die letzte Antwort. Andere Seiten wie Login oder Checkout tragen oft eigene Policies; prüfen Sie diese mit DevTools oder curl.
- Er liest nur den durchgesetzten
Content-Security-Policy-Header. In der Report-Only-Phase meldet er die CSP daher weiterhin als fehlend, mit mittlerem Risiko, denn eine reine Berichts-Policy blockiert nichts. Bis zur Durchsetzung ist dieses Ergebnis zu erwarten. - Eine
frame-ancestors-Direktive in der durchgesetzten Policy zählt als Frame-Schutz, ebenso wieX-Frame-Options. - In der separaten Härtungsnote (A bis F) erhält eine CSP weniger Punkte, wenn
default-srcoder einescript-src- bzw.style-src-Direktive (einschließlich der Varianten-elemund-attr)'unsafe-inline'enthält oder wenndefault-srcoder eine Skript-Direktive'unsafe-eval'enthält. Die Note liest die Policy so, wie sie geschrieben ist; ein'unsafe-inline'als Rückfall neben einer Nonce kostet also ebenfalls Punkte, obwohl aktuelle Browser es ignorieren. - Nonces, Hashes,
'strict-dynamic',object-src,base-uriund Berichte bewertet er nicht. Dafür nutzen Sie die Browserkonsole und Ihre Verstoßberichte.
Das Ergebnis zeigt einen Score und das Ergebnis jeder der acht Prüfungen, sodass Sie das CSP-Signal neben HSTS, TLS und den übrigen öffentlichen Prüfungen sehen.
Häufige Fragen
Welches Content-Security-Policy-Beispiel eignet sich für den Einstieg?
Für eine serverseitig gerenderte Website: script-src 'nonce-{zufall}' 'strict-dynamic'; object-src 'none'; base-uri 'none'; frame-ancestors 'self', mit einer neuen Nonce bei jeder Antwort. Für statische oder gecachte Seiten verwenden Sie statt der Nonce Hashes Ihrer Inline-Skripte. Starten Sie beide Varianten als Content-Security-Policy-Report-Only.
Sollte ich in meiner CSP eine Nonce oder einen Hash verwenden?
Eine Nonce, wenn Ihre Anwendung jede Seite erzeugt, denn dann kann sie jedes Mal einen neuen Wert einsetzen. Hashes, wenn das HTML statisch oder gecacht ist, denn eine gecachte Nonce würde für alle Besucher wiederverwendet. Beide lassen sich mit 'strict-dynamic' kombinieren.
Ist 'unsafe-inline' in style-src ein Problem?
Es ist ein geringeres Risiko als 'unsafe-inline' in script-src, doch eingeschleustes CSS kann weiterhin verändern, was Besucher sehen, und einzelne Seitendaten preisgeben. Behalten Sie es nur als dokumentierte Ausnahme, während Sie Styles in Stylesheets verlagern oder Style-Elementen Nonces geben.
Schützt Content-Security-Policy-Report-Only meine Website?
Nein. Der Header blockiert nichts, er meldet nur, was eine durchgesetzte Policy blockieren würde. Nutzen Sie ihn zum Testen und wechseln Sie danach zum Header Content-Security-Policy. Beide lassen sich gleichzeitig senden, was beim Testen der nächsten, strengeren Version hilft.
Kann ich eine CSP per Meta-Tag setzen?
Ja, für die meisten Direktiven. frame-ancestors, report-uri und sandbox werden in einem Meta-Tag jedoch ignoriert, und eine Report-Only-Policy lässt sich so nicht ausliefern. Nutzen Sie den HTTP-Header, wo immer Ihr Server oder Hoster das erlaubt.
Was ist der Unterschied zwischen report-uri und report-to?
report-uri erhält direkt eine URL; CSP Level 3 erklärt es für veraltet, ältere Browser sind aber noch darauf angewiesen. report-to benennt einen Endpunkt aus dem Header Reporting-Endpoints und nutzt das Format der Reporting API. Browser mit report-to-Unterstützung ignorieren report-uri, deshalb schadet es nicht, beides zu senden.
Quellen und weiterführende Links
- W3C: Content Security Policy Level 3www.w3.org
- MDN: Leitfaden zur Content Security Policy (CSP)developer.mozilla.org
- MDN: Content-Security-Policy-Headerdeveloper.mozilla.org
- MDN: CSP-Direktive script-srcdeveloper.mozilla.org
- MDN: CSP-Direktive frame-ancestorsdeveloper.mozilla.org
- MDN: CSP-Direktive report-todeveloper.mozilla.org
- MDN: Reporting-Endpoints-Headerdeveloper.mozilla.org
- W3C: Reporting APIwww.w3.org
- web.dev: Mitigate cross-site scripting (XSS) with a strict Content Security Policy (CSP)web.dev
- Google Tag Platform: Use Tag Manager with a Content Security Policydevelopers.google.com
- OWASP Content Security Policy Cheat Sheetcheatsheetseries.owasp.org
Erstellt von der Sitelemetry-Redaktion. Die verlinkten Quellen bieten weiterführende Informationen.



