Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
Content-Security-Policy: script-src Richtlinie
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.
Die HTTPContent-Security-Policy (CSP)script-src-Richtlinie spezifiziert gültige Quelladressen für JavaScript. Dies umfasst nicht nur URLs, die direkt in<script>-Elemente geladen werden, sondern auch Dinge wie Inline-Skript-Event-Handler (onclick) undXSLT Stylesheets, die die Skriptausführung auslösen können.
| CSP-Version | 1 |
|---|---|
| Richtlinientyp | Fetch directive |
default-src Fallback | Ja. Wenn diese Richtlinie fehlt, sucht der Benutzeragent nach derdefault-src-Richtlinie. |
In diesem Artikel
Syntax
Content-Security-Policy: script-src 'none';Content-Security-Policy: script-src <source-expression-list>;Diese Richtlinie kann einen der folgenden Werte haben:
'none'Keine Ressourcen dieses Typs dürfen geladen werden. Die einfachen Anführungszeichen sind obligatorisch.
<source-expression-list>Eine durch Leerzeichen getrennte Liste vonsource expression Werten. Ressourcen dieses Typs dürfen geladen werden, wenn sie mit einem der angegebenen Quellenausdrücke übereinstimmen. Für diese Richtlinie sind alle Quellenausdrückewerte aus derFetch-Direktiven-Syntax anwendbar.
Beispiele
>Erlauben von Ressourcen von vertrauenswürdigen Domänen
Gegeben ist dieser CSP-Header, der nur Skripte vonhttps://example.com erlaubt:
Content-Security-Policy: script-src https://example.com/Das folgende Skript wird blockiert und nicht geladen oder ausgeführt:
<script src="https://not-example.com/js/library.js"></script>Beachten Sie, dass auch Inline-Event-Handler blockiert werden:
<button>Click me</button>Sie sollten sie durchaddEventListener Aufrufe ersetzen:
document.getElementById("btn").addEventListener("click", doSomething);Falls Sie Inline-Event-Handler nicht ersetzen können, können Sie den Quellenausdruck'unsafe-hashes' verwenden, um sie zu erlauben.Weitere Informationen finden Sie unterUnsichere Hashes.
Erlauben von externen Skripten mit Hashes
Das Erlauben von vertrauenswürdigen Domänen, wie im obigen Abschnitt gezeigt, ist ein pragmatischer Ansatz für die Spezifikation der Standorte, von denen Code sicher geladen werden kann, insbesondere wenn Ihre Site viele Ressourcen verwendet und Sie darauf vertrauen, dass die vertrauenswürdige Site nicht kompromittiert wird.
Eine alternative Methode besteht darin, erlaubte Skripte mit Dateihashes zu spezifizieren.Mit diesem Ansatz kann eine externe Datei in einem<script>-Element nur geladen und ausgeführt werden, wenn alle gültigen Hash-Werte in ihremintegrity Attribut mit den erlaubten Werten im CSP-Header übereinstimmen.DieSubresource Integrity-Funktion überprüft zusätzlich, ob die heruntergeladene Datei den angegebenen Hash-Wert hat und daher nicht verändert wurde.Dies ist sicherer als das Vertrauen in eine Domäne, da Dateien nur verwendet werden, wenn sie unverändert sind, selbst wenn sie von einer kompromittierten Site geladen werden.Es ist jedoch granularer und erfordert, dass Hash-Werte in CSP- und Skriptelementen aktualisiert werden, wann immer die zugehörigen Skripte geändert werden.
Der nachfolgende CSP-Header demonstriert den Ansatz.Er erlaubt Skripte, für die der SHA384-HashoqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC oder der SHA256-Hashfictional_value ist.
Content-Security-Policy: script-src 'sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC' 'sha256-fictional_value'Dasexample-framework.js-Skript unten sollte geladen werden, weil der Hash-Wert in seinemintegrity-Attribut auch im CSP vorhanden ist (vorausgesetzt, die Datei hat tatsächlich den Hash, sobald sie heruntergeladen ist!)
<script src="https://example.com/example-framework.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>Dasintegrity-Attribut kann mehrere Werte enthalten, die jeweils einen Hash für die Datei darstellen, berechnet mit einem anderen Algorithmus.Damit ein externes Skript geladen werden kann, erfordert CSP, dassalle gültigen Hash-Werte im Attribut auch in der CSPscript-src-Deklaration vorhanden sein müssen.Daher würde das folgende Skript nicht geladen, da der zweite Hash im obigen CSP-Header nicht vorhanden ist.
<script src="https://example.com/example-framework.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC sha256-not-in-csp" crossorigin="anonymous"></script>Diese Regel gilt nur fürgültige Hash-Werte.Werte, die vom Browser nicht als Hashes erkannt werden, werden ignoriert, sodass das folgende Skript geladen werden sollte:
<script src="https://example.com/example-framework.js" integrity="invalid-or-unsupported-hash sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>Subresource Integrity enthält weitere Informationen zur Berechnung von Hashes und zur Verwendung desintegrity-Attributs.
Unsichere Inline-Skripte
Hinweis:Das Verhindern von Inline-Stilen und Inline-Skripten ist einer der größten Sicherheitsgewinne, die CSP bietet.Wenn Sie sie unbedingt verwenden müssen, gibt es einige Mechanismen, die dies erlauben.Hashes gelten für Inline-Skripte und Stile, aber nicht für Event-Handler.Weitere Informationen finden Sie unterUnsichere Hashes.
Um Inline-Skripte und Styles zu erlauben, kann'unsafe-inline', eine Nonce-Quelle oder eine Hash-Quelle angegeben werden, die mit dem Inline-Block übereinstimmt.Die folgende Content-Security-Policy erlaubt alle Inline-<script>-Elemente:
Content-Security-Policy: script-src 'unsafe-inline';Das folgende<script>-Element wird durch die Richtlinie erlaubt:
<script> const inline = 1; // …</script>Das Erlauben aller Inline-Skripte gilt als Sicherheitsrisiko, daher wird empfohlen, stattdessen eine Nonce-Quelle oder eine Hash-Quelle zu verwenden.Um Inline-Skripte und Styles mit einer Nonce-Quelle zu erlauben, müssen Sie einen zufälligen Nonce-Wert (unter Verwendung eines kryptographisch sicheren Zufallstoken-Generators) generieren und in die Richtlinie aufnehmen.Es ist wichtig zu beachten, dass dieser Nonce-Wert dynamisch generiert werden muss, da er für jede HTTP-Anfrage einzigartig sein muss:
Content-Security-Policy: script-src 'nonce-2726c7f26c'Dann müssen Sie den gleichen Nonce in das<script>-Element aufnehmen:
<script nonce="2726c7f26c"> const inline = 1; // …</script>Alternativ können Sie Hashes aus Ihren Inline-Skripten erstellen. CSP unterstützt sha256, sha384 und sha512.
Content-Security-Policy: script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='Wenn Sie den Hash generieren, schließen Sie die<script>-Tags nicht ein und beachten Sie, dass Großschreibung und Leerzeichen eine Rolle spielen, einschließlich führender oder nachfolgender Leerzeichen.
<script> const inline = 1;</script>Unsichere Hashes
Richtlinien für Inline-Ressourcen mit Hashes wiescript-src 'sha256-{HASHED_INLINE_SCRIPT}' erlauben Skripte und Styles anhand ihres Hashes, aber nicht Event-Handler:
<!-- Allowed by CSP: script-src 'sha256-{HASHED_INLINE_SCRIPT}' --><script> const inline = 1;</script><!-- CSP: script-src 'sha256-{HASHED_EVENT_HANDLER}' will not allow this event handler --><button>Submit</button>Anstatt'unsafe-inline' zu erlauben, können Sie den Quellenausdruck'unsafe-hashes' verwenden, wenn der Code nicht zu entsprechendenaddEventListener Aufrufen aktualisiert werden kann.Angesichts einer HTML-Seite, die den folgenden Inline-Event-Handler enthält:
<!-- I want to use addEventListener, but I can't :( --><button>Submit</button>Der folgende CSP-Header erlaubt die Ausführung des Skripts:
Content-Security-Policy: script-src 'unsafe-hashes' 'sha256-{HASHED_EVENT_HANDLER}'Unsichere eval-Ausdrücke
Der Quellenausdruck'unsafe-eval' steuert mehrere Skriptausführungsmethoden, die Code aus Zeichenfolgen erstellen.Wenn eine Seite einen CSP-Header hat und'unsafe-eval' nicht mit derscript-src-Richtlinie angegeben ist, werden die folgenden Methoden blockiert und haben keine Wirkung:
eval()Function()Wenn Sie eine Zeichenfolgenliterale wie an Methoden übergeben:
setTimeout("alert(\"Hello World!\");", 500);window.execScript()Nicht standardisiert (nur IE < 11)
Unsichere WebAssembly-Ausführung
Der Quellenausdruck'wasm-unsafe-eval' steuert die WebAssembly-Ausführung.Wenn eine Seite einen CSP-Header hat und'wasm-unsafe-eval' nicht in derscript-src-Richtlinie angegeben ist, wird das Laden und Ausführen von WebAssembly auf der Seite blockiert.
Der Quellenausdruck'wasm-unsafe-eval' ist spezifischer als'unsafe-eval', das sowohl die Kompilierung (und Instanzierung) von WebAssembly als auch zum Beispiel die Verwendung deseval-Vorgangs in JavaScript erlaubt.Wenn das Schlüsselwort'unsafe-eval' verwendet wird, überschreibt dies jedes Vorkommen von'wasm-unsafe-eval' in der CSP-Richtlinie.
Content-Security-Policy: script-src 'wasm-unsafe-eval'strict-dynamic
Der Quellenausdruck'strict-dynamic' gibt an, dass das einer im Markup vorhandenen Script explizit gegebene Vertrauen, indem es von einem Nonce oder einem Hash begleitet wird, auf alle von diesem Root-Skript geladenen Skripte übertragen werden soll. Gleichzeitig werden alle Erlaubnislisten oder Quellenausdrücke wie'self' oder'unsafe-inline' ignoriert.
Zum Beispiel würde eine Richtlinie wiescript-src 'strict-dynamic' 'nonce-R4nd0m' https://allowlisted.example.com/ das Laden eines Root-Skripts mit<script nonce="R4nd0m" src="https://example.com/loader.js"> und die Übertragung dieses Vertrauens auf jedes vonloader.js geladene Skript erlauben, aber das Laden von Skripten vonhttps://allowlisted.example.com/ verbieten, es sei denn, sie werden von einem Nonce begleitet oder von einem vertrauenswürdigen Skript geladen.
Content-Security-Policy: script-src 'strict-dynamic' 'nonce-someNonce'Oder:
Content-Security-Policy: script-src 'strict-dynamic' 'sha256-base64EncodedHash'Es ist möglich,strict-dynamic rückwärtskompatibel zu implementieren, ohne eine Benutzeragenten-Abfrage zu benötigen.Die Richtlinie:
Content-Security-Policy: script-src 'unsafe-inline' https: 'nonce-abcdefg' 'strict-dynamic'wird wie'unsafe-inline' https: in Browsern, die CSP1 unterstützen,https: 'nonce-abcdefg' in Browsern, die CSP2 unterstützen, und'nonce-abcdefg' 'strict-dynamic' in Browsern, die CSP3 unterstützen, wirken.
Zulassen von Spekulationsregeln
UmSpekulationsregeln in einem Skriptelement einzuschließen (siehe auch<script type="speculationrules">), müssen Sie diescript-src-Richtlinie mit einer der'inline-speculation-rules' Quellen, einer Hash-Quelle oder einer Nonce-Quelle verwenden. Zum Beispiel:
Content-Security-Policy: script-src 'inline-speculation-rules'Spezifikationen
| Specification |
|---|
| Content Security Policy Level 3> # directive-script-src> |