Content-Security-Policy: style-src Direktive
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.
Die HTTP-Content-Security-Policy (CSP) style-src-Direktive spezifiziert gültige Quellen für Stylesheets.
| CSP-Version | 1 |
|---|---|
| Direktivtyp | Fetch-Direktive |
default-src Fallback |
Ja. Wenn diese Direktive fehlt, wird der User-Agent nach der
default-src-Direktive suchen.
|
Syntax
Content-Security-Policy: style-src 'none';
Content-Security-Policy: style-src <source-expression-list>;
Diese Direktive 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 von Quellausdruck-Werten. Ressourcen dieses Typs dürfen geladen werden, wenn sie mit einem der angegebenen Quellausdrücke übereinstimmen. Für diese Direktive sind folgende Quellausdruck-Werte anwendbar:
<host-source><scheme-source>'self''unsafe-inline''unsafe-hashes''nonce-<nonce_value>''<hash_algorithm>-<hash_value>''report-sample'
Beachten Sie, dass die Spezifikation auch
'unsafe-eval'als gültigen Quellausdruckswert einschließt, um die CSSOM-Methoden zu erlauben, die CSS-Strings parsen und einfügen, einschließlich derinsertRule()-Methoden und dercssText-Setter auf verschiedenen Schnittstellen, wieCSSStyleSheet.insertRule()undCSSStyleDeclaration.cssText. Es blockiert jedoch derzeit kein Browser diese Methoden, sodass es nicht notwendig ist,unsafe-evalanzuwenden.
Beispiele
>Fälle von Verletzungen
Angenommen, dieser CSP-Header ist gegeben:
Content-Security-Policy: style-src https://example.com/
folgende Stylesheets werden blockiert und nicht geladen:
<link href="https://not-example.com/styles/main.css" rel="stylesheet" />
<style>
#inline-style {
background: red;
}
</style>
<style>
@import "https://not-example.com/styles/print.css" print;
</style>
sowie Styles, die unter Verwendung des Link-Headers geladen werden:
Link: <https://not-example.com/styles/stylesheet.css>;rel=stylesheet
Inline-Style-Attribute werden ebenfalls blockiert:
<div style="display:none">Foo</div>
Sowie Styles, die in JavaScript durch direktes Setzen des style-Attributs oder durch Setzen von cssText angewendet werden:
document.querySelector("div").setAttribute("style", "display:none;");
document.querySelector("div").style.cssText = "display:none;";
Da jedoch Stil-Eigenschaften, die direkt auf der style-Eigenschaft des Elements gesetzt werden, nicht blockiert werden, können Benutzer Stile sicher über JavaScript manipulieren:
document.querySelector("div").style.display = "none";
Diese Arten von Manipulationen können verhindert werden, indem JavaScript über die script-src-CSP-Direktive untersagt wird.
Unsichere Inline-Stile
Hinweis: Das Untersagen von Inline-Stilen und -Skripten ist einer der größten Sicherheitsgewinne, die CSP bietet. Wenn Sie diese jedoch unbedingt verwenden müssen, gibt es einige Mechanismen, die sie erlauben.
Um Inline-Stile zu erlauben, können 'unsafe-inline', eine nonce-Quelle oder eine Hash-Quelle, die mit dem Inline-Block übereinstimmt, angegeben werden. Die folgende Content Security Policy erlaubt Inline-Stile wie das <style>-Element und das style-Attribut auf jedem Element:
Content-Security-Policy: style-src 'unsafe-inline';
Das folgende <style>-Element und style-Attribut wird von der Richtlinie erlaubt:
<style>
#inline-style {
background: red;
}
</style>
<div style="display:none">Foo</div>
Sie können eine Nonce-Quelle verwenden, um nur bestimmte Inline-Stilblöcke zu erlauben. Sie müssen einen zufälligen Nonce-Wert generieren (unter Verwendung eines kryptografisch sicheren Zufallstoken-Generators) und ihn in die Richtlinie einfügen. Es ist wichtig zu beachten, dass dieser Nonce-Wert dynamisch generiert werden muss, da er für jede HTTP-Anfrage eindeutig sein muss:
Content-Security-Policy: style-src 'nonce-2726c7f26c'
Sie müssen denselben Nonce auf das <style>-Element setzen:
<style nonce="2726c7f26c">
#inline-style {
background: red;
}
</style>
Alternativ können Sie Hashes von Ihren Inline-Stilen erstellen. CSP unterstützt sha256, sha384 und sha512. Die binäre Form des Hashes muss mit base64 kodiert werden. Sie können den Hash eines Strings über die openssl-Programmzeile erhalten:
echo -n "#inline-style { background: red; }" | openssl dgst -sha256 -binary | openssl enc -base64
Sie können eine Hash-Quelle verwenden, um nur bestimmte Inline-Stilblöcke zu erlauben:
Content-Security-Policy: style-src 'sha256-ozBpjL6dxO8fsS4u6fwG1dFDACYvpNxYeBA6tzR+FY8='
Beim Erstellen des Hashes sollten Sie die <style>-Tags nicht einfügen und beachten, dass Groß-/Kleinschreibung und Leerzeichen, einschließlich führender oder nachfolgender Leerzeichen, entscheidend sind.
<style>
#inline-style {
background: red;
}
</style>
Spezifikationen
| Specification |
|---|
| Content Security Policy Level 3> # directive-style-src> |
Browser-Kompatibilität
Loading…