Content-Security-Policy: style-src 指令

Baseline 已廣泛支援

此功能已相當成熟,可在多種裝置和瀏覽器版本上執行。自 ⁨2016 年 8 月⁩ 起,所有瀏覽器均已提供此功能。

HTTP Content-Security-Policy (CSP) 的 style-src 指令指定了樣式表的有效來源。

CSP 版本 1
指令型別 獲取指令
default-src 回退 是的。如果此指令缺失,使用者代理將查詢 default-src 指令。

語法

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

此指令可以具有以下值之一

'none'

不允許載入此型別的任何資源。單引號是強制性的。

<source-expression-list>

一個由源表示式值組成的空格分隔列表。如果資源型別與任何給定的源表示式匹配,則可以載入此類資源。對於此指令,以下源表示式值適用:

請注意,規範中也包含了 'unsafe-eval' 作為有效的源表示式值,以允許解析和插入 CSS 字串的 CSSOM 方法,包括 insertRule() 方法以及各種介面上的 cssText setter,例如 CSSStyleSheet.insertRule()CSSStyleDeclaration.cssText。然而,目前沒有瀏覽器會阻止這些方法,因此無需應用 unsafe-eval

示例

違規情況

給定此 CSP 頭

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

以下樣式表將被阻止,無法載入:

html
<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>

以及使用 Link 頭載入的樣式:

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

內聯樣式屬性也將被阻止:

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

以及透過直接設定 style 屬性或設定 cssText 在 JavaScript 中應用的樣式:

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

然而,直接在元素的 style 屬性上設定的樣式屬性將不會被阻止,允許使用者透過 JavaScript 安全地操作樣式:

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

可以透過 script-src CSP 指令禁止 JavaScript 來防止這些型別的操作。

不安全的內聯樣式

注意:禁止內聯樣式和內聯指令碼是 CSP 提供的最大安全優勢之一。但是,如果你絕對必須使用它們,有幾種機制可以允許它們。

要允許內聯樣式,可以指定 'unsafe-inline'、一個 nonce-source 或一個與內聯塊匹配的 hash-source。以下內容安全策略將允許像 <style> 元素和任何元素上的 style 屬性這樣的內聯樣式:

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

以下 <style> 元素和 style 屬性將受策略允許:

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

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

你可以使用 nonce-source 來只允許特定的內聯樣式塊。你需要生成一個隨機 nonce 值(使用加密安全的隨機令牌生成器)並將其包含在策略中。重要的是,此 nonce 值需要動態生成,因為它必須對每個 HTTP 請求都是唯一的。

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

你必須在 <style> 元素上設定相同的 nonce:

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

或者,你可以從內聯樣式建立雜湊。CSP 支援 sha256、sha384 和 sha512。雜湊的二進位制形式必須用 base64 編碼。你可以透過 openssl 程式在命令列上獲取字串的雜湊:

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

你可以使用 hash-source 來只允許特定的內聯樣式塊。

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

生成雜湊時,不要包含 <style> 標籤,並且請注意大小寫和空格(包括前導或尾隨空格)都很重要。

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

規範

規範
內容安全策略級別 3
# directive-style-src

瀏覽器相容性

另見