CSP: style-src

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-Richtlinie style-src legt gültige Quellen für Stylesheets fest.

CSP-Version 1
Richtlinientyp Fetch-Richtlinie
default-src Fallback Ja. Wenn diese Richtlinie nicht vorhanden ist, sucht der User-Agent nach der default-src-Richtlinie.

Syntax

http
Content-Security-Policy: style-src 'none';
Content-Security-Policy: style-src <source-expression-list>;

Diese Richtlinie kann einen der folgenden Werte haben:

'none'

Es dürfen keine Ressourcen dieses Typs geladen werden. Die einfachen Anführungszeichen sind verpflichtend.

<source-expression-list>

Eine durch Leerzeichen getrennte Liste von Source-Expression-Werten. Ressourcen dieses Typs dürfen geladen werden, wenn sie mit einem der angegebenen Source Expressions übereinstimmen. Für diese Richtlinie sind folgende Source Expression-Werte anwendbar:

Beachten Sie, dass die Spezifikation auch 'unsafe-eval' als gültigen Source Expression-Wert enthält, um die CSSOM-Methoden zuzulassen, die CSS-Strings parsen und einfügen, einschließlich der insertRule()-Methoden und der cssText-Setter auf verschiedenen Schnittstellen, wie CSSStyleSheet.insertRule() und CSSStyleDeclaration.cssText. Derzeit blockiert jedoch kein Browser diese Methoden, daher besteht keine Notwendigkeit, unsafe-eval anzuwenden.

Beispiele

Verletzungsfälle

Angenommen, dieser CSP-Header ist gegeben:

http
Content-Security-Policy: style-src https://example.com/

die folgenden Stylesheets werden blockiert und nicht geladen:

html
<link href="https://not-example.com/styles/main.css" rel="stylesheet" />

<style>
  #inline-style {
    background: red;
  }
</style>

<style>
  @import url("https://not-example.com/styles/print.css") print;
</style>

sowie Styles, die unter Verwendung des Link-Headers geladen werden:

http
Link: <https://not-example.com/styles/stylesheet.css>;rel=stylesheet

Inline-Style-Attribute werden ebenfalls blockiert:

html
<div style="display:none">Foo</div>

sowie Styles, die in JavaScript durch direktes Setzen des style-Attributs oder durch Setzen von cssText angewendet werden:

js
document.querySelector("div").setAttribute("style", "display:none;");
document.querySelector("div").style.cssText = "display:none;";

Jedoch werden Style-Eigenschaften, die direkt auf der style-Eigenschaft des Elements gesetzt werden, nicht blockiert, was es Benutzern ermöglicht, Styles sicher über JavaScript zu manipulieren:

js
document.querySelector("div").style.display = "none";

Diese Arten von Manipulationen können verhindert werden, indem JavaScript über die script-src-CSP-Richtlinie untersagt wird.

Unsichere Inline-Styles

Hinweis: Das Verbot von Inline-Styles und Inline-Skripten ist einer der größten Sicherheitsvorteile, die CSP bietet. Wenn Sie sie jedoch unbedingt verwenden müssen, gibt es einige Mechanismen, die dies ermöglichen.

Um Inline-Styles zu erlauben, kann 'unsafe-inline', eine nonce-Quelle oder eine hash-Quelle, die mit dem Inline-Block übereinstimmt, spezifiziert werden. Die folgende Content Security Policy erlaubt Inline-Styles wie das <style>-Element und das style-Attribut an jedem Element:

http
Content-Security-Policy: style-src 'unsafe-inline';

Das folgende <style>-Element und style-Attribut werden von der Richtlinie erlaubt:

html
<style>
  #inline-style {
    background: red;
  }
</style>

<div style="display:none">Foo</div>

Sie können eine nonce-Quelle verwenden, um nur bestimmte Inline-Style-Blö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 einzigartig sein muss:

http
Content-Security-Policy: style-src 'nonce-2726c7f26c'

Sie müssen das gleiche nonce auf dem <style>-Element setzen:

html
<style nonce="2726c7f26c">
  #inline-style {
    background: red;
  }
</style>

Alternativ können Sie Hashes aus Ihren Inline-Styles erstellen. CSP unterstützt sha256, sha384 und sha512. Die binäre Form des Hashes muss mit base64 codiert werden. Sie können den Hash eines Strings über die Befehlszeile mittels des openssl-Programms erhalten:

bash
echo -n "#inline-style { background: red; }" | openssl dgst -sha256 -binary | openssl enc -base64

Sie können eine hash-Quelle verwenden, um nur bestimmte Inline-Style-Blöcke zu erlauben:

http
Content-Security-Policy: style-src 'sha256-ozBpjL6dxO8fsS4u6fwG1dFDACYvpNxYeBA6tzR+FY8='

Beim Erstellen des Hashes schließen Sie die <style>-Tags nicht ein und beachten Sie, dass Groß-/Kleinschreibung und Leerzeichen von Bedeutung sind, einschließlich führender oder nachfolgender Leerzeichen.

html
<style>
  #inline-style {
    background: red;
  }
</style>

Spezifikationen

Specification
Content Security Policy Level 3
# directive-style-src

Browser-Kompatibilität

Siehe auch