Content-Security-Policy (CSP)
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since August 2016.
* Some parts of this feature may have varying levels of support.
Der HTTP Content-Security-Policy
Antwort-Header ermöglicht es Website-Administratoren, zu kontrollieren, welche Ressourcen ein Benutzeragent für eine bestimmte Seite laden darf. Mit wenigen Ausnahmen beinhalten die Richtlinien hauptsächlich die Spezifikation von Server-Ursprüngen und Skriptendpunkten. Dies hilft, Cross-Site-Scripting Angriffe zu verhindern.
Siehe den Content Security Policy (CSP) Leitfaden für Details darüber, wie eine CSP an den Browser geliefert wird, wie sie aussieht, Anwendungsfälle und Bereitstellungsstrategien.
Header-Typ | Antwort-Header |
---|---|
Verbotener Anfrage-Header | Nein |
Syntax
Content-Security-Policy: <policy-directive>; <policy-directive>
wobei <policy-directive>
aus folgendem besteht:
<directive> <value>
ohne innere Interpunktion.
Direktiven
Fetch-Direktiven
Fetch-Direktiven steuern die Orte, von denen bestimmte Ressourcentypen geladen werden können.
child-src
-
Definiert die gültigen Quellen für Web Worker und verschachtelte Browsing-Kontexte, die mit Elementen wie
<frame>
und<iframe>
geladen werden.Ersatz für
frame-src
undworker-src
. connect-src
-
Beschränkt die URLs, die über Skript-Schnittstellen geladen werden können.
default-src
-
Dient als Ersatz für die anderen Fetch-Direktiven.
Ersatz für alle anderen Fetch-Direktiven.
fenced-frame-src
Experimentell-
Spezifiziert gültige Quellen für verschachtelte Browsing-Kontexte, die in
<fencedframe>
Elemente geladen werden. font-src
-
Spezifiziert gültige Quellen für Schriften, die mit
@font-face
geladen werden. frame-src
-
Spezifiziert gültige Quellen für verschachtelte Browsing-Kontexte, die in Elemente wie
<frame>
und<iframe>
geladen werden. img-src
-
Spezifiziert gültige Quellen für Bilder und Favicons.
manifest-src
-
Spezifiziert gültige Quellen für Anwendungs-Manifestdateien.
media-src
-
Spezifiziert gültige Quellen zum Laden von Medien über die
<audio>
,<video>
und<track>
Elemente. object-src
-
Spezifiziert gültige Quellen für die
<object>
und<embed>
Elemente. prefetch-src
Veraltet Nicht standardisiert-
Spezifiziert gültige Quellen, die vorgeladen oder vorgerendert werden sollen.
script-src
-
Spezifiziert gültige Quellen für JavaScript- und WebAssembly-Ressourcen.
Ersatz für
script-src-elem
undscript-src-attr
. script-src-elem
-
Spezifiziert gültige Quellen für JavaScript
<script>
Elemente. script-src-attr
-
Spezifiziert gültige Quellen für JavaScript Inline-Event-Handler.
style-src
-
Spezifiziert gültige Quellen für Stylesheets.
Ersatz für
style-src-elem
undstyle-src-attr
. style-src-elem
-
Spezifiziert gültige Quellen für Stylesheets
<style>
Elemente und<link>
Elemente mitrel="stylesheet"
. style-src-attr
-
Spezifiziert gültige Quellen für Inline-Stile, die auf einzelne DOM-Elemente angewendet werden.
worker-src
-
Spezifiziert gültige Quellen für
Worker
,SharedWorker
oderServiceWorker
Skripte.
Alle Fetch-Direktiven können den Einzelwert 'none'
angeben, was bedeutet, dass der spezifische Ressourcentyp vollständig blockiert werden soll, oder als eine oder mehrere Quellen-Ausdrucks-Werte, die gültige Quellen für diesen Ressourcentyp angeben. Siehe Fetch-Direktive-Syntax für mehr Details.
Ersatze
Einige Fetch-Direktiven funktionieren als Ersatze für andere, detailliertere Direktiven. Dies bedeutet, dass, wenn die detailliertere Direktive nicht spezifiziert wird, der Ersatz zur Bereitstellung einer Richtlinie für diesen Ressourcentyp verwendet wird.
default-src
ist ein Ersatz für alle anderen Fetch-Direktiven.script-src
ist ein Ersatz fürscript-src-attr
undscript-src-elem
.style-src
ist ein Ersatz fürstyle-src-attr
undstyle-src-elem
.child-src
ist ein Ersatz fürframe-src
undworker-src
.
Beispielsweise:
- Wenn
img-src
weggelassen, aberdefault-src
eingeschlossen wird, dann wird die durchdefault-src
definierte Richtlinie für Bilder angewendet. - Wenn
script-src-elem
weggelassen, aberscript-src
eingeschlossen wird, dann wird die durchscript-src
definierte Richtlinie auf<script>
Elemente angewendet. - Wenn
script-src-elem
undscript-src
beide weggelassen werden, aberdefault-src
eingeschlossen ist, dann wird die durchdefault-src
definierte Richtlinie auf<script>
Elemente angewendet.
Dokument-Direktiven
Dokument-Direktiven regeln die Eigenschaften eines Dokuments oder einer Worker Umgebung, auf die eine Richtlinie angewendet wird.
Navigations-Direktiven
Navigations-Direktiven regeln, zu welchen Orten ein Benutzer navigieren oder ein Formular einsenden kann, zum Beispiel.
form-action
-
Beschränkt die URLs, die als Ziel einer Formularübermittlung aus einem gegebenen Kontext verwendet werden können.
frame-ancestors
-
Spezifiziert gültige Eltern, die eine Seite mit
<frame>
,<iframe>
,<object>
oder<embed>
einbetten können.
Reporting-Direktiven
Reporting-Direktiven steuern die Ziel-URL für CSP-Verstoßberichte in Content-Security-Policy
und Content-Security-Policy-Report-Only
.
report-to
-
Liefert dem Browser ein Token, das den Berichts-Endpunkt oder die Berichts-Endpunktgruppe identifiziert, an die Informationen über CSP-Verstöße gesendet werden sollen. Die Endpunkte, die das Token repräsentiert, werden durch andere HTTP-Header bereitgestellt, wie
Reporting-Endpoints
undReport-To
Veraltet .Warnung: Diese Direktive soll
report-uri
ersetzen; in Browsern, diereport-to
unterstützen, wird diereport-uri
Direktive ignoriert. Bisreport-to
jedoch breit unterstützt wird, sollten Sie beide Header wie gezeigt angeben (wobeiendpoint_name
der Name eines separat bereitgestellten Endpunkts ist):httpContent-Security-Policy: …; report-uri https://endpoint.example.com; report-to endpoint_name
Andere Direktiven
require-trusted-types-for
Experimentell-
Erzwingt Trusted Types an den DOM XSS-Injektionsstellen.
trusted-types
Experimentell-
Wird verwendet, um eine Positivliste von Trusted Types Richtlinien anzugeben. Trusted Types ermöglichen es Anwendungen, DOM XSS-Injektionsstellen so zu sperren, dass nur nicht manipulierbare, typisierte Werte anstelle von Zeichenfolgen akzeptiert werden.
upgrade-insecure-requests
-
Weist Benutzeragenten an, alle unsicheren URLs einer Website (die über HTTP bereitgestellt werden) so zu behandeln, als wären sie mit sicheren URLs (die über HTTPS bereitgestellt werden) ersetzt worden. Diese Direktive ist für Websites mit einer großen Anzahl unsicherer alter URLs gedacht, die umgeschrieben werden müssen.
Veraltete Direktiven
block-all-mixed-content
Veraltet-
Verhindert das Laden von Assets über HTTP, wenn die Seite über HTTPS geladen wird.
report-uri
Veraltet-
Bietet dem Browser eine URL, an die CSP-Verstoßberichte gesendet werden sollen. Dies wurde durch die
report-to
Direktive ersetzt.
Fetch-Direktive-Syntax
Alle Fetch-Direktiven können wie folgt angegeben werden:
- den Einzelwert
'none'
, was bedeutet, dass der spezifische Ressourcentyp vollständig blockiert werden soll - ein oder mehrere Quellen-Ausdrucks-Werte, die gültige Quellen für diesen Ressourcentyp angeben.
Jeder Quellen-Ausdruck nimmt eine der unten aufgeführten Formen an. Beachten Sie, dass nicht alle Formen für alle Fetch-Direktiven anwendbar sind: siehe die Dokumentation für jede Fetch-Direktive, um herauszufinden, welche Formen anwendbar sind.
Die <host-source>
und <scheme-source>
Formate müssen unverpackt sein, und alle anderen Formate müssen in einfache Anführungszeichen eingeschlossen sein.
'nonce-<nonce_value>'
Dieser Wert besteht aus dem String nonce-
, gefolgt von einem Base64-kodierten String. Dieser String ist ein zufälliger Wert, den der Server für jede HTTP-Antwort generiert. Zum Beispiel:
'nonce-416d1177-4d12-4e3b-b7c9-f6c409789fb8'
Der Server kann dann denselben Wert als Wert des nonce
Attributes von <script>
oder <style>
Ressourcen aufnehmen, die sie aus dem Dokument laden möchten.
Der Browser vergleicht den Wert aus der CSP-Direktive mit dem Wert im Elementattribut und lädt die Ressource nur, wenn sie übereinstimmen.
Wenn eine Direktive ein Nonce und unsafe-inline
enthält, ignoriert der Browser unsafe-inline
.
Siehe Nonces im CSP-Leitfaden für weitere Informationen zur Verwendung.
'<hash_algorithm>-<hash_value>'
Dieser Wert besteht aus einem String, der einen Hash-Algorithmus identifiziert, gefolgt von -
, gefolgt von einem Base64-kodierten String, der den Hash-Wert darstellt.
- Der Hash-Algorithmus-Identifier muss einer der folgenden sein:
sha256
,sha384
odersha512
. - Der Hash-Wert ist der Base64-kodierte Hash einer
<script>
oder<style>
Ressource, berechnet mit einer der folgenden Hash-Funktionen: SHA-256, SHA-384 oder SHA-512.
Zum Beispiel:
'sha256-cd9827ad...'
Wenn der Browser das Dokument empfängt, hashiert er den Inhalt aller <script>
und <style>
Elemente, vergleicht das Ergebnis mit allen Hashes in der CSP-Direktive und lädt die Ressource nur, wenn es eine Übereinstimmung gibt.
Wenn das Element eine externe Ressource lädt (zum Beispiel mit dem src
Attribut), muss das Element auch das integrity
Attribut gesetzt haben.
Wenn eine Direktive einen Hash und unsafe-inline
enthält, ignoriert der Browser unsafe-inline
.
Siehe Hashes im CSP-Leitfaden für weitere Informationen zur Verwendung.
<host-source>
Die URL oder IP-Adresse eines Host, der eine gültige Quelle für die Ressource darstellt.
Das Schema, die Portnummer und der Pfad sind optional.
Wenn das Schema weggelassen wird, wird das Schema des Ursprungs des Dokuments verwendet.
Beim Abgleichen von Schemata sind sichere Upgrades erlaubt. Zum Beispiel:
http://example.com
erlaubt auch Ressourcen vonhttps://example.com
ws://example.org
erlaubt auch Ressourcen vonwss://example.org
.
Wildcards ('*'
) können für Subdomains, Host-Adressen und Portnummern verwendet werden, was bedeutet, dass alle legalen Werte von jedem gültig sind. Zum Beispiel:
http://*.example.com
erlaubt Ressourcen von beliebigen Subdomains vonexample.com
, über HTTP oder HTTPS.
Pfade, die mit /
enden, stimmen mit allen Pfaden überein, deren Präfix sie sind. Zum Beispiel:
example.com/api/
erlaubt Ressourcen vonexample.com/api/users/new
.
Pfade, die nicht mit /
enden, werden genau verglichen. Zum Beispiel:
https://example.com/file.js
erlaubt Ressourcen vonhttps://example.com/file.js
aber nichthttps://example.com/file.js/file2.js
.
<scheme-source>
Ein Schema, wie https:
. Der Doppelpunkt ist erforderlich.
Sichere Upgrades sind erlaubt, also:
http:
erlaubt auch Ressourcen, die über HTTPS geladen werdenws:
erlaubt auch Ressourcen, die über WSS geladen werden.
'self'
Ressourcen des angegebenen Typs dürfen nur aus dem gleichen Ursprung wie das Dokument geladen werden.
Sichere Upgrades sind erlaubt. Zum Beispiel:
- Wenn das Dokument von
http://example.com
bereitgestellt wird, erlaubt eine CSP von'self'
auch Ressourcen vonhttps://example.com
. - Wenn das Dokument von
ws://example.org
bereitgestellt wird, erlaubt eine CSP von'self'
auch Ressourcen vonwss://example.org
.
'unsafe-eval'
Standardmäßig, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, sind JavaScript-Funktionen, die ihre Argumente als JavaScript auswerten, deaktiviert. Dies schließt eval()
, das code
Argument von setTimeout()
oder den Function()
Konstruktor ein.
Das unsafe-eval
Schlüsselwort kann verwendet werden, um diesen Schutz rückgängig zu machen und die dynamische Auswertung von Strings als JavaScript zu erlauben.
Warnung:
Entwickler sollten 'unsafe-eval'
vermeiden, da es den Zweck einer CSP weitgehend untergräbt.
Siehe eval()
und ähnliche APIs im CSP-Leitfaden für weitere Informationen zur Verwendung.
'wasm-unsafe-eval'
Standardmäßig, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, darf eine Seite WebAssembly nicht mit Funktionen wie WebAssembly.compileStreaming()
kompilieren.
Das wasm-unsafe-eval
Schlüsselwort kann verwendet werden, um diesen Schutz rückgängig zu machen. Dies ist eine viel sicherere Alternative zu 'unsafe-eval'
, da es keine allgemeine Auswertung von JavaScript ermöglicht.
'unsafe-inline'
Standardmäßig, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, darf Inline-JavaScript nicht ausgeführt werden. Dies schließt ein:
- Inline-
<script>
-Tags - Inline-Event-Handler-Attribute
javascript:
URLs.
Ebenso, wenn eine CSP default-src
oder eine style-src
Direktive enthält, wird Inline-CSS nicht geladen, einschließlich:
- Inline-
<style>
-Tags style
Attribute.
Das unsafe-inline
Schlüsselwort kann verwendet werden, um diesen Schutz rückgängig zu machen und alle diese Formulare zu laden.
Warnung:
Entwickler sollten 'unsafe-inline'
vermeiden, da es den Zweck einer CSP weitgehend untergräbt.
Siehe Inline-JavaScript im CSP-Leitfaden für weitere Informationen zur Verwendung.
'unsafe-hashes'
Standardmäßig, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, dürfen Inline-Event-Handler-Attribute wie onclick
und Inline-style
-Attribute nicht ausgeführt werden.
Der 'unsafe-hashes'
Ausdruck erlaubt dem Browser die Nutzung von Hash-Ausdrücken für Inline-Event-Handler und style
-Attribute. Zum Beispiel könnte eine CSP eine Direktive enthalten wie:
script-src 'unsafe-hashes' 'sha256-cd9827ad...'
Wenn der Hash-Wert mit dem Hash eines Inline-Event-Handler-Attributwerts oder eines style
-Attributwerts übereinstimmt, wird der Code ausgeführt.
Warnung:
Der 'unsafe-hashes'
Wert ist unsicher.
Besonders ermöglicht er einen Angriff, bei dem der Inhalt des Inline-Event-Handler-Attributs als Inline-<script>
-Element ins Dokument injiziert wird. Angenommen, der Inline-Event-Handler ist:
<button onclick="transferAllMyMoney()">Transfer all my money</button>
Wenn ein Angreifer ein Inline-<script>
-Element mit diesem Code injizieren kann, erlaubt die CSP dessen automatische Ausführung.
Dennoch ist 'unsafe-hashes'
viel sicherer als 'unsafe-inline'
.
'inline-speculation-rules'
Standardmäßig, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, darf Inline-JavaScript nicht ausgeführt werden. Die 'inline-speculation-rules'
erlaubt dem Browser, Inline-<script>
-Elemente zu laden, die ein type
Attribut von speculationrules
haben.
Siehe die Speculation Rules API für weitere Informationen.
'strict-dynamic'
Das 'strict-dynamic'
Schlüsselwort erweitert das Vertrauen, das auf ein Skript durch einen Nonce oder einen Hash übertragen wird, auf Skripte, die dieses Skript dynamisch lädt, zum Beispiel durch Erstellen neuer <script>
-Tags mit Document.createElement()
und anschließendes Einfügen in das Dokument mit Node.appendChild()
.
Wenn dieses Schlüsselwort in einer Direktive vorhanden ist, werden die folgenden Quellausdruckswerte alle ignoriert:
Siehe Das strict-dynamic
Schlüsselwort im CSP-Leitfaden für weitere Informationen zur Verwendung.
'report-sample'
Wenn dieser Ausdruck in einer Direktive enthalten ist, die Skripte oder Stile kontrolliert, und die Direktive dazu führt, dass der Browser Inline-Skripte, Inline-Stile oder Event-Handler-Attribute blockiert, dann enthält der Verstoßbericht, den der Browser generiert, eine sample
Eigenschaft mit den ersten 40 Zeichen der blockierten Ressource.
CSP in Workern
Worker werden im Allgemeinen nicht durch die Content-Security-Policy des Dokuments (oder des übergeordneten Workers) geregelt, das sie erstellt hat. Um eine Content-Security-Policy für den Worker zu spezifizieren, setzen Sie einen Content-Security-Policy
Antwort-Header für die Anfrage, die das Worker-Skript selbst angefordert hat.
Die Ausnahme ist, wenn der Ursprung des Worker-Skripts ein global eindeutiger Bezeichner ist (zum Beispiel, wenn seine URL ein Schema von "data" oder "blob" hat). In diesem Fall erbt der Worker die Content-Security-Policy des Dokuments oder Workers, der ihn erstellt hat.
Mehrere Content-Security-Policies
Der CSP-Mechanismus erlaubt mehrere Richtlinien, die für eine Ressource spezifiziert werden können, einschließlich über den Content-Security-Policy
Header, den Content-Security-Policy-Report-Only
Header und ein <meta>
Element.
Sie können den Content-Security-Policy
Header mehr als einmal verwenden, wie im folgenden Beispiel. Achten Sie besonders auf die connect-src
Direktive hier. Selbst wenn die zweite Richtlinie die Verbindung zulassen würde, enthält die erste Richtlinie connect-src 'none'
. Das Hinzufügen zusätzlicher Richtlinien kann nur weiter die Fähigkeiten der geschützten Ressource einschränken, was bedeutet, dass keine Verbindung erlaubt ist und, als die strengste Richtlinie, connect-src 'none'
durchgesetzt wird.
Content-Security-Policy: default-src 'self' http://example.com;
connect-src 'none';
Content-Security-Policy: connect-src http://example.com/;
script-src http://example.com/
Beispiele
Unsicheren Inline-Code deaktivieren und nur HTTPS-Ressourcen erlauben
Dieser HTTP-Header setzt die Standardrichtlinie, um nur das Laden von Ressourcen (Bilder, Schriftarten, Skripte usw.) über HTTPS zu erlauben. Da die Direktiven unsafe-inline
und unsafe-eval
nicht gesetzt sind, werden Inline-Skripte blockiert.
Content-Security-Policy: default-src https:
Die gleichen Einschränkungen können unter Verwendung des HTML <meta>
Elements angewendet werden.
<meta http-equiv="Content-Security-Policy" content="default-src https:" />
Inline-Code und HTTPS-Ressourcen erlauben, aber Plugins deaktivieren
Diese Richtlinie könnte auf einer bereits bestehenden Seite verwendet werden, die zu viel Inline-Code verwendet, um sie zu beheben. Sie stellt sicher, dass Ressourcen nur über HTTPS geladen werden und deaktiviert Plugins:
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'
Verstöße melden, aber nicht erzwingen, wenn getestet wird
Dieses Beispiel setzt die gleichen Einschränkungen wie das vorherige Beispiel, verwendet jedoch den Content-Security-Policy-Report-Only
Header und die report-to
Direktive. Dieser Ansatz wird während der Tests verwendet, um Verstöße zu melden, aber den Code nicht daran zu hindern, ausgeführt zu werden.
Endpunkte (URLs), an die Berichte gesendet werden sollen, werden mit dem Reporting-Endpoints
HTTP-Antwort-Header definiert.
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"
Ein bestimmter Endpunkt wird dann als Berichtsziel in der CSP Richtlinie unter Verwendung der report-to
Direktive ausgewählt.
Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-url/; report-to csp-endpoint
Beachten Sie, dass die report-uri
Veraltet
Direktive oben ebenfalls angegeben ist, da report-to
noch nicht umfassend von Browsern unterstützt wird.
Siehe Content Security Policy (CSP) Implementierung für weitere Beispiele.
Spezifikationen
Specification |
---|
Content Security Policy Level 3 # csp-header |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
Content-Security-Policy-Report-Only
- Lernen über: Content Security Policy
- Content Security in WebExtensions
- Übernahme einer strikten Richtlinie
- CSP Evaluator - Bewerten Sie Ihre Content Security Policy