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 Website-Administratoren die Kontrolle darüber, welche Ressourcen der Benutzeragent für eine bestimmte Seite laden darf. Mit wenigen Ausnahmen beinhalten Richtlinien meist die Spezifikation von Server-Ursprüngen und Skript-Endpunkten.
Dies hilft, Cross-Site Scripting Angriffe zu verhindern.
Sehen Sie sich den Content Security Policy (CSP) Leitfaden an, um Details darüber zu erfahren, wie eine CSP an den Browser übermittelt wird, wie sie aussieht sowie Anwendungsfälle und Bereitstellungsstrategien.
Header-Typ | Antwort-Header |
---|---|
Verbotener Header-Name | nein |
Syntax
Content-Security-Policy: <policy-directive>; <policy-directive>
wobei <policy-directive>
besteht aus:
<directive> <value>
ohne interne Interpunktion.
Direktiven
Fetch-Direktiven
Fetch-Direktiven kontrollieren die Orte, von denen bestimmte Ressourcentypen geladen werden dürfen.
child-src
-
Definiert die gültigen Quellen für Web Worker und verschachtelte Browsing-Kontexte, die mit Elementen wie
<frame>
und<iframe>
geladen werden.Fallback für
frame-src
undworker-src
. connect-src
-
Beschränkt die URLs, die mit Skript-Schnittstellen geladen werden können.
default-src
-
Dient als Fallback für die anderen Fetch-Direktiven.
Fallback für alle anderen Fetch-Direktiven.
fenced-frame-src
Experimentell-
Gibt gültige Quellen für verschachtelte Browsing-Kontexte an, die in
<fencedframe>
-Elementen geladen werden. font-src
-
Gibt gültige Quellen für Schriften an, die mit
@font-face
geladen werden. frame-src
-
Gibt gültige Quellen für verschachtelte Browsing-Kontexte an, die in Elementen wie
<frame>
und<iframe>
geladen werden. img-src
-
Gibt gültige Quellen für Bilder und Favicons an.
manifest-src
-
Gibt gültige Quellen für Anwendungsmanifestdateien an.
media-src
-
Gibt gültige Quellen für das Laden von Medien mit den Elementen
<audio>
,<video>
und<track>
an. object-src
-
Gibt gültige Quellen für die Elemente
<object>
und<embed>
an. prefetch-src
Veraltet Nicht standardisiert-
Gibt gültige Quellen an, die vorgeladen oder vorgerendert werden sollen.
script-src
-
Gibt gültige Quellen für JavaScript- und WebAssembly-Ressourcen an.
Fallback für
script-src-elem
undscript-src-attr
. script-src-elem
-
Gibt gültige Quellen für JavaScript-
<script>
-Elemente an. script-src-attr
-
Gibt gültige Quellen für JavaScript-Inline-Event-Handler an.
style-src
-
Gibt gültige Quellen für Stylesheets an.
Fallback für
style-src-elem
undstyle-src-attr
. style-src-elem
-
Gibt gültige Quellen für Stylesheets-
<style>
-Elemente und<link>
-Elemente mitrel="stylesheet"
an. style-src-attr
-
Gibt gültige Quellen für Inline-Stile an, die auf einzelne DOM-Elemente angewendet werden.
worker-src
-
Gibt gültige Quellen für
Worker
,SharedWorker
oderServiceWorker
-Skripte an.
Alle Fetch-Direktiven können mit dem einzelnen Wert 'none'
spezifiziert werden, was bedeutet, dass der spezifische Ressourcentyp vollständig blockiert werden sollte, oder als ein oder mehrere source expression Werte, die gültige Quellen für diesen Ressourcentyp angeben. Siehe Fetch-Direktiven-Syntax für weitere Details.
Fallbacks
Einige Fetch-Direktiven fungieren als Fallbacks für andere, granulärere Direktiven. Dies bedeutet, dass, wenn die granulärere Direktive nicht spezifiziert ist, der Fallback verwendet wird, um eine Richtlinie für diesen Ressourcentyp bereitzustellen.
default-src
ist ein Fallback für alle anderen Fetch-Direktiven.script-src
ist ein Fallback fürscript-src-attr
undscript-src-elem
.style-src
ist ein Fallback fürstyle-src-attr
undstyle-src-elem
.child-src
ist ein Fallback fürframe-src
undworker-src
.
Zum Beispiel:
- Wenn
img-src
ausgelassen wird, aberdefault-src
enthalten ist, wird die Richtlinie, die durchdefault-src
definiert wird, auf Bilder angewendet. - Wenn
script-src-elem
ausgelassen wird, aberscript-src
enthalten ist, wird die Richtlinie, die durchscript-src
definiert wird, auf<script>
-Elemente angewendet. - Wenn sowohl
script-src-elem
als auchscript-src
ausgelassen werden, aberdefault-src
enthalten ist, wird die Richtlinie, die durchdefault-src
definiert wird, 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 senden kann, zum Beispiel.
form-action
-
Beschränkt die URLs, die als Ziel eines Formularabsendungen von einem gegebenen Kontext verwendet werden können.
frame-ancestors
-
Gibt gültige Eltern an, die eine Seite mit
<frame>
,<iframe>
,<object>
oder<embed>
einbetten dürfen.
Berichts-Direktiven
Berichts-Direktiven kontrollieren die Ziel-URL für CSP-Verletzungsberichte in Content-Security-Policy
und Content-Security-Policy-Report-Only
.
report-to
-
Bietet dem Browser ein Token, das den Berichts-Endpunkt oder eine Gruppe von Endpunkten identifiziert, an die CSP-Verletzungsinformationen gesendet werden sollen. Die Endpunkte, die das Token repräsentiert, werden durch andere HTTP-Header bereitgestellt, wie z.B.
Reporting-Endpoints
undReport-To
Veraltet .Warnung: Diese Direktive soll
report-uri
ersetzen; in Browsern, diereport-to
unterstützen, wird diereport-uri
-Direktive ignoriert. Bis jedochreport-to
breit unterstützt wird, sollten Sie beide Header angeben, wie gezeigt (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-Injektions-Punkten.
trusted-types
Experimentell-
Verwendet, um eine Whitelist von Trusted Types-Richtlinien zu spezifizieren. Trusted Types ermöglichen es Anwendungen, DOM XSS Injektions-Punkte zu sperren, sodass 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 durch sichere URLs (die über HTTPS bereitgestellt werden) ersetzt worden. Diese Direktive ist für Websites mit einer großen Anzahl unsicherer Legacy-URLs gedacht, die umgeschrieben werden müssen.
Veraltete Direktiven
block-all-mixed-content
Veraltet-
Verhindert das Laden von Ressourcen über HTTP, wenn die Seite über HTTPS geladen wird.
report-uri
Veraltet-
Gibt dem Browser eine URL an, an die CSP-Verletzungsberichte gesendet werden sollen. Dies wurde durch die
report-to
-Direktive ersetzt.
Fetch-Direktiven-Syntax
Alle Fetch-Direktiven können auf eine der folgenden Arten angegeben werden:
- der einzelne Wert
'none'
, der besagt, dass der spezifische Ressourcentyp vollständig blockiert werden soll - ein oder mehrere source expression Werte, die gültige Quellen für diesen Ressourcentyp angeben.
Jede Quell-Ausdrucksform nimmt eine der unten aufgeführten Formen an. Beachten Sie, dass nicht alle Formen auf alle Fetch-Direktiven anwendbar sind: Siehe die Dokumentation für jede Fetch-Direktive, um herauszufinden, welche Formen darauf anwendbar sind.
Die Formate <host-source>
und <scheme-source>
müssen nicht in Anführungszeichen stehen, und alle anderen Formate müssen in einfache Anführungszeichen gesetzt werden.
'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
-Attributs von <script>
oder <style>
Ressourcen einfügen, die er aus dem Dokument laden möchte.
Der Browser vergleicht den Wert aus der CSP-Direktive mit dem Wert im Element-Attribut und lädt die Ressource nur, wenn sie übereinstimmen.
Wenn eine Direktive einen Nonce und unsafe-inline
enthält, ignoriert der Browser unsafe-inline
.
Siehe Nonces im CSP-Leitfaden für weitere Nutzungsinformationen.
'<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-Identifikator muss entweder
sha256
,sha384
odersha512
sein. - 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 erhält, hasht 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 eine Übereinstimmung vorliegt.
Wenn das Element eine externe Ressource lädt (zum Beispiel mit dem src
Attribut), muss das Element auch das integrity
Attribut haben.
Wenn eine Direktive einen Hash und unsafe-inline
enthält, ignoriert der Browser unsafe-inline
.
Siehe Hashes im CSP-Leitfaden für weitere Nutzungsinformationen.
<host-source>
Die URL oder IP-Adresse eines Hosts, der eine gültige Quelle für die Ressource ist.
Das Schema, die Portnummer und der Pfad sind optional.
Wenn das Schema weggelassen wird, wird das Schema des Ursprungs des Dokuments verwendet.
Beim Vergleich von Schemas sind sichere Upgrades erlaubt. Zum Beispiel:
http://example.com
erlaubt ebenfalls Ressourcen vonhttps://example.com
ws://example.org
erlaubt ebenfalls Ressourcen vonwss://example.org
.
Platzhalter ('*'
) können für Subdomains, Host-Adressen und Portnummern verwendet werden und geben an, dass alle legalen Werte von jedem gültig sind. Zum Beispiel:
http://*.example.com
erlaubt Ressourcen von allen Subdomains vonexample.com
, über HTTP oder HTTPS.
Pfade, die mit /
enden, stimmen mit jedem Pfad überein, dessen Präfix sie sind. Zum Beispiel:
example.com/api/
wird Ressourcen vonexample.com/api/users/new
erlauben.
Pfade, die nicht mit /
enden, werden genau verglichen. Zum Beispiel:
https://example.com/file.js
erlaubt Ressourcen vonhttps://example.com/file.js
, aber nicht vonhttps://example.com/file.js/file2.js
.
<scheme-source>
Ein Schema, wie https:
. Der Doppelpunkt ist erforderlich.
Sichere Upgrades sind erlaubt, also:
http:
erlaubt ebenfalls Ressourcen, die unter HTTPS geladen werdenws:
erlaubt ebenfalls Ressourcen, die unter WSS geladen werden.
'self'
Ressourcen des gegebenen Typs dürfen nur aus demselben Ursprung wie das Dokument geladen werden.
Sichere Upgrades sind erlaubt. Zum Beispiel:
- Wenn das Dokument von
http://example.com
ausgeliefert wird, erlaubt eine CSP von'self'
ebenfalls Ressourcen vonhttps://example.com
. - Wenn das Dokument von
ws://example.org
ausgeliefert wird, erlaubt eine CSP von'self'
ebenfalls Ressourcen vonwss://example.org
.
'unsafe-eval'
Standardmäßig werden, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, JavaScript-Funktionen, die ihre Argumente als JavaScript auswerten, deaktiviert. Dies umfasst eval()
, das code
Argument zu setTimeout()
, oder den Function()
Konstruktor.
Das unsafe-eval
Schlüsselwort kann verwendet werden, um diesen Schutz aufzuheben, sodass die dynamische Auswertung von Strings als JavaScript ermöglicht wird.
Warnung:
Entwickler sollten 'unsafe-eval'
vermeiden, da es den Zweck einer CSP weitgehend zunichte macht.
Siehe eval()
und ähnliche APIs im CSP-Leitfaden für weitere Nutzungsinformationen.
'wasm-unsafe-eval'
Standardmäßig ist, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, eine Seite nicht erlaubt, WebAssembly unter Verwendung von Funktionen wie WebAssembly.compileStreaming()
zu kompilieren.
Das wasm-unsafe-eval
Schlüsselwort kann verwendet werden, um diesen Schutz aufzuheben. Dies ist eine viel sicherere Alternative zu 'unsafe-eval'
, da es keine allgemeine Auswertung von JavaScript ermöglicht.
'unsafe-inline'
Standardmäßig ist, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, das Ausführen von Inline-JavaScript nicht erlaubt. Dies umfasst:
- Inline-
<script>
-Tags - Inline-Event-Handler-Attribute
javascript:
-URLs.
Ähnlich, 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 aufzuheben und all diese Formen zu laden.
Warnung:
Entwickler sollten 'unsafe-inline'
vermeiden, da es den Zweck einer CSP weitgehend zunichte macht.
Siehe Inline-JavaScript im CSP-Leitfaden für weitere Nutzungsinformationen.
'unsafe-hashes'
Standardmäßig ist, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, das Ausführen von Inline-Event-Handler-Attributen wie onclick
und Inline-style
-Attributen nicht erlaubt.
Der 'unsafe-hashes'
Ausdruck erlaubt es dem Browser, hash expressions für Inline-Event-Handler und style
Attribute zu verwenden. Beispielsweise könnte eine CSP eine Direktive wie diese enthalten:
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.
Insbesondere ermöglicht er einen Angriff, bei dem der Inhalt des Inline-Event-Handler-Attributs in das Dokument als Inline-<script>
-Element injiziert wird. Nehmen wir an, 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, wird die CSP es automatisch ausführen lassen.
Dennoch ist 'unsafe-hashes'
viel sicherer als 'unsafe-inline'
.
'inline-speculation-rules'
Standardmäßig ist, wenn eine CSP eine default-src
oder eine script-src
Direktive enthält, das Ausführen von Inline-JavaScript nicht erlaubt. Durch 'inline-speculation-rules'
kann der Browser Inline-<script>
-Elemente laden, die ein type
Attribut von speculationrules
haben.
Siehe die Speculation Rules API für mehr Informationen.
'strict-dynamic'
Das 'strict-dynamic'
Schlüsselwort erweitert das Vertrauen, das von einem nonce oder einem hash auf ein Skript übertragen wird, auf Skripte, die dieses Skript dynamisch lädt, z. B. 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 folgende Quell-Ausdruckswerte alle ignoriert:
Siehe The strict-dynamic
keyword im CSP-Leitfaden für mehr Nutzungsinformationen.
'report-sample'
Wenn dieser Ausdruck in eine Direktive aufgenommen wird, die Skripte oder Stile steuert, und die Direktive den Browser dazu veranlasst, Inline-Skripte, Inline-Stile oder Event-Handler-Attribute zu blockieren, dann enthält der Verletzungsbericht das der Browser generiert, eine sample
Eigenschaft, die die ersten 40 Zeichen der blockierten Ressource enthält.
CSP in Arbeitern
Worker werden im Allgemeinen nicht durch die Inhalts-Sicherheitsrichtlinie des Dokuments (oder des übergeordneten Workers) gesteuert, das sie erstellt hat. Um eine Inhalts-Sicherheitsrichtlinie 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 hiervon ist, wenn der Ursprung des Worker-Skripts ein weltweit eindeutiger Bezeichner ist (zum Beispiel, wenn seine URL ein Schema von data oder blob hat). In diesem Fall erbt der Worker die Inhalts-Sicherheitsrichtlinie des Dokuments oder des Workers, der ihn erstellt hat.
Mehrere Inhalts-Sicherheitsrichtlinien
Der CSP-Mechanismus ermöglicht es, mehrere Richtlinien für eine Ressource zu spezifizieren, 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
nachstehenden Beispiel. Achten Sie besonders auf die connect-src
-Direktive hier. Auch wenn die zweite Richtlinie die Verbindung erlauben würde, enthält die erste Richtlinie
connect-src 'none'
. Das Hinzufügen weiterer Richtlinien kann nur weitere
Einschränkungen der Fähigkeiten der geschützten Ressource bewirken, 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 zulassen
Dieser HTTP-Header setzt die Standardrichtlinie, um das Laden von Ressourcen (Bilder, Schriftarten, Skripte usw.) nur über HTTPS zuzulassen.
Da die Direktiven unsafe-inline
und unsafe-eval
nicht gesetzt sind, werden Inline-Skripte blockiert.
Content-Security-Policy: default-src https:
Dieselben Einschränkungen können mithilfe des HTML-<meta>
-Elements angewendet werden.
<meta http-equiv="Content-Security-Policy" content="default-src https:" />
Inline-Code und HTTPS-Ressourcen zulassen, aber Plugins deaktivieren
Diese Richtlinie könnte auf einer bereits existierenden Website verwendet werden, die zu viel Inline-Code verwendet, um es zu beheben, um sicherzustellen, dass Ressourcen nur über HTTPS geladen werden und Plugins deaktiviert sind:
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'
Verstöße beim Testen melden, aber nicht erzwingen
Dieses Beispiel legt dieselben Einschränkungen wie das vorherige Beispiel fest, jedoch unter Verwendung des Content-Security-Policy-Report-Only
Headers und der report-to
Direktive.
Dieser Ansatz wird bei Tests verwendet, um Verstöße zu melden, aber den Code nicht am Ausführen zu hindern.
Endpunkte (URLs), an die Berichte gesendet werden, werden über den Reporting-Endpoints
HTTP-Antwort-Header definiert.
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"
Ein bestimmter Endpunkt wird dann in der CSP-Richtlinie mit der report-to
Direktive als Berichtsziel 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 ebenfalls oben angegeben ist, da report-to
derzeit noch nicht weitgehend 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 Sie über: Content Security Policy
- Content Security in WebExtensions
- Einführung einer strengen Richtlinie
- CSP Evaluator - Evaluieren Sie Ihre Content-Security-Policy