內容安全策略 (CSP) 標頭

Baseline 廣泛可用 *

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

* 此特性的某些部分可能存在不同級別的支援。

HTTP Content-Security-Policy 響應標頭允許網站管理員控制使用者代理被允許為給定頁面載入的資源。除少數例外,策略主要涉及指定伺服器來源和指令碼端點。這有助於防範跨站點指令碼攻擊。

有關 CSP 如何傳遞到瀏覽器、其外觀以及用例和部署策略的詳細資訊,請參閱內容安全策略 (CSP) 指南。

頭型別 響應頭
禁止請求頭

語法

http
Content-Security-Policy: <policy-directive>; <policy-directive>

其中 <policy-directive> 由以下內容組成:<directive> <value>,無內部標點符號。

指令

Fetch 指令

Fetch 指令控制可以從哪些位置載入特定資源型別。

child-src

定義使用 <frame><iframe> 等元素載入的Web Worker 和巢狀瀏覽上下文的有效源。

frame-srcworker-src回退

connect-src

限制可以使用指令碼介面載入的 URL。

default-src

作為其他fetch 指令的回退。

所有其他 fetch 指令的回退

fenced-frame-src 實驗性

指定載入到 <fencedframe> 元素中的巢狀瀏覽上下文的有效源。

font-src

指定使用 @font-face 載入的字型的有效源。

frame-src

指定載入到 <frame><iframe> 等元素中的巢狀瀏覽上下文的有效源。

img-src

指定影像和網站圖示的有效源。

manifest-src

指定應用程式清單檔案的有效源。

media-src

指定使用 <audio><video><track> 元素載入媒體的有效源。

object-src

指定 <object><embed> 元素的有效源。

prefetch-src 已棄用 非標準

指定要預取或預渲染的有效源。

script-src

指定 JavaScript 和 WebAssembly 資源的有效源。

script-src-elemscript-src-attr回退

script-src-elem

指定 JavaScript <script> 元素的有效源。

script-src-attr

指定 JavaScript 內聯事件處理程式的有效源。

style-src

指定樣式表的有效源。

style-src-elemstyle-src-attr回退

style-src-elem

指定樣式表 <style> 元素和帶有 rel="stylesheet"<link> 元素的有效源。

style-src-attr

指定應用於單個 DOM 元素的內聯樣式的有效源。

worker-src

指定 WorkerSharedWorkerServiceWorker 指令碼的有效源。

所有 fetch 指令都可以指定為單個值 'none',表示應完全阻止特定資源型別,或指定為一個或多個源表示式值,表示該資源型別的有效源。有關詳細資訊,請參閱Fetch 指令語法

回退

某些 fetch 指令充當其他更細粒度指令的回退。這意味著如果未指定更細粒度的指令,則使用回退為該資源型別提供策略。

  • default-src 是所有其他 fetch 指令的回退。
  • script-srcscript-src-attrscript-src-elem 的回退。
  • style-srcstyle-src-attrstyle-src-elem 的回退。
  • child-srcframe-srcworker-src 的回退。

例如

  • 如果省略 img-src 但包含 default-src,則由 default-src 定義的策略將應用於影像。
  • 如果省略 script-src-elem 但包含 script-src,則由 script-src 定義的策略將應用於 <script> 元素。
  • 如果 script-src-elemscript-src 都省略,但包含 default-src,則由 default-src 定義的策略將應用於 <script> 元素。

文件指令

文件指令控制應用策略的文件或 工作器環境的屬性。

base-uri

限制可用於文件 <base> 元素的 URL。

sandbox

為請求的資源啟用沙盒,類似於 <iframe> sandbox 屬性。

導航指令控制使用者可以導航或提交表單的位置,例如。

form-action

限制可用於給定上下文的表單提交目標的 URL。

frame-ancestors

指定可以使用 <frame><iframe><object><embed> 嵌入頁面的有效父級。

報告指令

報告指令控制 Content-Security-PolicyContent-Security-Policy-Report-Only 中 CSP 違規報告的目標 URL。

report-to

向瀏覽器提供一個令牌,用於識別向其傳送 CSP 違規資訊的報告端點或端點組。令牌所代表的端點透過其他 HTTP 標頭提供,例如 Reporting-EndpointsReport-To 已棄用

警告:此指令旨在替換 report-uri;在支援 report-to 的瀏覽器中,report-uri 指令將被忽略。但是,在 report-to 獲得廣泛支援之前,您應該同時指定這兩個標頭(其中 endpoint_name 是單獨提供的端點的名稱),如下所示:

http
Content-Security-Policy: …; report-uri https://endpoint.example.com; report-to endpoint_name

其他指令

require-trusted-types-for

在 DOM XSS 注入點強制執行 Trusted Types

trusted-types

用於指定 Trusted Types 策略的允許列表。Trusted Types 允許應用程式鎖定 DOM XSS 注入點,只接受不可偽造的型別化值而非字串。

upgrade-insecure-requests

指示使用者代理將網站所有不安全的 URL(透過 HTTP 提供)視為已替換為安全 URL(透過 HTTPS 提供)。此指令適用於具有大量不安全舊式 URL 且需要重寫的網站。

已棄用的指令

block-all-mixed-content 已棄用

當頁面使用 HTTPS 載入時,阻止使用 HTTP 載入任何資產。

report-uri 已棄用

向瀏覽器提供一個 URL,應將 CSP 違規報告發送到該 URL。此功能已被 report-to 指令取代。

Fetch 指令語法

所有 fetch 指令都可以指定為以下其中一種:

  • 單個值 'none',表示應完全阻止特定資源型別
  • 一個或多個源表示式值,表示該資源型別的有效源。

每個源表示式採用下面列出的形式之一。請注意,並非所有形式都適用於所有 fetch 指令:請參閱每個 fetch 指令的文件以瞭解哪些形式適用於它。

<host-source><scheme-source> 格式必須不帶引號,所有其他格式必須用單引號括起來。

'nonce-<nonce_value>'

此值由字串 nonce- 後跟一個 nonce 值組成。nonce 值可以使用 Base64URL 安全 Base64 中的任何字元。

此字串是伺服器為每個 HTTP 響應生成的隨機值。例如:

'nonce-416d1177-4d12-4e3b-b7c9-f6c409789fb8'

然後,伺服器可以將相同的值作為任何打算從文件載入的 <script><style> 資源的 nonce 屬性的值包含在內。

瀏覽器將 CSP 指令中的值與元素屬性中的值進行比較,並且僅當它們匹配時才載入資源。

如果指令包含 nonce 和 unsafe-inline,則瀏覽器將忽略 unsafe-inline

有關更多用法資訊,請參閱 CSP 指南中的Nonces

注意:Nonce 源表示式僅適用於 <script><style> 元素。

'<hash_algorithm>-<hash_value>'

此值由一個標識雜湊演算法的字串,後跟 -,再後跟一個雜湊值組成。雜湊值可以使用 Base64URL 安全 Base64 中的任何字元。

  • 雜湊演算法識別符號必須是 sha256sha384sha512 之一。
  • 雜湊值是 雜湊 的 base64 編碼,它是使用以下雜湊函式之一計算的 <script><style> 資源:SHA-256、SHA-384 或 SHA-512。

例如

'sha256-cd9827ad...'

當瀏覽器接收到文件時,它會雜湊任何 <script><style> 元素的內容,將結果與 CSP 指令中的任何雜湊進行比較,並且僅當匹配時才載入資源。

如果元素載入外部資源(例如,使用 src 屬性),則該元素還必須設定 integrity 屬性。

如果指令包含雜湊和 unsafe-inline,則瀏覽器將忽略 unsafe-inline

有關更多用法資訊,請參閱 CSP 指南中的雜湊

注意:雜湊源表示式僅適用於 <script><style> 元素。

<host-source>

作為資源有效源的URL主機 IP 地址。

方案、埠號和路徑是可選的。

如果省略方案,則使用文件源的方案。

在匹配方案時,允許安全升級。例如:

  • http://example.com 也將允許來自 https://example.com 的資源
  • ws://example.org 也將允許來自 wss://example.org 的資源。

萬用字元 ('*') 可用於子域、主機地址和埠號,表示它們的任何合法值都有效。例如:

  • http://*.example.com 允許來自 example.com 任何子域的資源,透過 HTTP 或 HTTPS。

/ 結尾的路徑匹配它們作為字首的任何路徑。例如:

  • example.com/api/ 將允許來自 example.com/api/users/new 的資源。

不以 / 結尾的路徑將精確匹配。例如:

  • https://example.com/file.js 允許來自 https://example.com/file.js 的資源,但不允許來自 https://example.com/file.js/file2.js 的資源。

<scheme-source>

一個方案,例如 https:。冒號是必需的。

允許安全升級,因此

  • http: 也將允許使用 HTTPS 載入的資源
  • ws: 也將允許使用 WSS 載入的資源。

'self'

給定型別的資源只能從與文件相同的載入。

允許安全升級。例如:

  • 如果文件是從 http://example.com 提供的,則 'self' 的 CSP 也將允許來自 https://example.com 的資源。
  • 如果文件是從 ws://example.org 提供的,則 'self' 的 CSP 也將允許來自 wss://example.org 的資源。

'unsafe-eval'

預設情況下,如果 CSP 包含 default-srcscript-src 指令,則停用將引數評估為 JavaScript 的 JavaScript 函式。這包括 eval()setTimeout()code 引數或 Function() 建構函式。

unsafe-eval 關鍵字可用於取消此保護,允許將字串動態評估為 JavaScript。

警告:開發者應避免使用 'unsafe-eval',因為它會破壞 CSP 的大部分目的。

有關更多用法資訊,請參閱 CSP 指南中的eval() 和類似 API

'wasm-unsafe-eval'

預設情況下,如果 CSP 包含 default-srcscript-src 指令,則頁面將不允許使用 WebAssembly.compileStreaming() 等函式編譯 WebAssembly。

wasm-unsafe-eval 關鍵字可用於取消此保護。這是一種比 'unsafe-eval' 更安全的替代方案,因為它不會啟用 JavaScript 的通用評估。

'unsafe-inline'

預設情況下,如果 CSP 包含 default-srcscript-src 指令,則不允許執行內聯 JavaScript。這包括

  • 內聯 <script> 標籤
  • 內聯事件處理程式屬性
  • javascript: URL。

同樣,如果 CSP 包含 default-srcstyle-src 指令,則不會載入內聯 CSS,包括

  • 內聯 <style> 標籤
  • style 屬性。

unsafe-inline 關鍵字可用於取消此保護,允許載入所有這些形式。

警告:開發者應避免使用 'unsafe-inline',因為它會破壞 CSP 的大部分目的。

有關更多用法資訊,請參閱 CSP 指南中的內聯 JavaScript

'unsafe-hashes'

預設情況下,如果 CSP 包含 default-srcscript-src 指令,則不允許執行 onclick 等內聯事件處理程式屬性和內聯 style 屬性。

'unsafe-hashes' 表示式允許瀏覽器對內聯事件處理程式和 style 屬性使用雜湊表示式。例如,CSP 可能包含這樣的指令

http
script-src 'unsafe-hashes' 'sha256-cd9827ad...'

如果雜湊值與內聯事件處理程式屬性值或 style 屬性值的雜湊匹配,則允許執行程式碼。

警告:'unsafe-hashes' 值是不安全的。

特別是,它啟用了一種攻擊,其中內聯事件處理程式屬性的內容作為內聯 <script> 元素注入到文件中。假設內聯事件處理程式是

html
<button onclick="transferAllMyMoney()">Transfer all my money</button>

如果攻擊者可以注入包含此程式碼的內聯 <script> 元素,則 CSP 將自動允許其執行。

但是,'unsafe-hashes''unsafe-inline' 安全得多。

'inline-speculation-rules'

預設情況下,如果 CSP 包含 default-srcscript-src 指令,則不允許執行內聯 JavaScript。'inline-speculation-rules' 允許瀏覽器載入具有 type 屬性為 speculationrules 的內聯 <script> 元素。

有關詳細資訊,請參閱 Speculation Rules API

'strict-dynamic'

'strict-dynamic' 關鍵字使得透過 nonce雜湊 授予指令碼的信任擴充套件到此指令碼動態載入的指令碼,例如透過使用 Document.createElement() 建立新的 <script> 標籤,然後使用 Node.appendChild() 將它們插入到文件中。

如果此關鍵字存在於指令中,則以下所有源表示式值都將被忽略

有關更多用法資訊,請參閱 CSP 指南中的strict-dynamic 關鍵字

'report-sample'

如果此表示式包含在控制指令碼或樣式的指令中,並且該指令導致瀏覽器阻止任何內聯指令碼、內聯樣式或事件處理程式屬性,則瀏覽器生成的違規報告將包含一個sample 屬性,其中包含被阻止資源的前 40 個字元。

工作器中的 CSP

工作器通常不受建立它們的文件(或父工作器)的內容安全策略的約束。要為工作器指定內容安全策略,請為請求工作器指令碼本身的請求設定 Content-Security-Policy 響應標頭。

此規則的例外情況是,如果工作器指令碼的來源是全域性唯一識別符號(例如,如果其 URL 的方案是資料或 blob)。在這種情況下,工作器確實繼承了建立它的文件或工作器的內容安全策略。

多個內容安全策略

CSP 機制允許為資源指定多個策略,包括透過 Content-Security-Policy 標頭、Content-Security-Policy-Report-Only 標頭和 <meta> 元素。

您可以多次使用 Content-Security-Policy 標頭,如以下示例所示。此處請特別注意 connect-src 指令。即使第二個策略允許連線,第一個策略也包含 connect-src 'none'。新增其他策略只能進一步限制受保護資源的功能,這意味著不允許任何連線,並且作為最嚴格的策略,將強制執行 connect-src 'none'

http
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/

示例

停用不安全的內聯程式碼並只允許 HTTPS 資源

此 HTTP 標頭將預設策略設定為僅允許透過 HTTPS 載入資源(影像、字型、指令碼等)。由於未設定 unsafe-inlineunsafe-eval 指令,因此內聯指令碼將被阻止。

http
Content-Security-Policy: default-src https:

可以使用 HTML <meta> 元素應用相同的限制。

html
<meta http-equiv="Content-Security-Policy" content="default-src https:" />

允許內聯程式碼和 HTTPS 資源,但停用外掛

此策略可用於使用過多內聯程式碼且無法修復的現有站點,以確保資源僅透過 HTTPS 載入並停用外掛

http
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'

在測試時報告但不強制執行違規

此示例設定了與上一個示例相同的限制,但使用了 Content-Security-Policy-Report-Only 標頭和 report-to 指令。此方法在測試期間用於報告違規但不阻止程式碼執行。

用於傳送報告的端點(URL)使用 Reporting-Endpoints HTTP 響應標頭定義。

http
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"

然後,在 CSP 策略中使用 report-to 指令選擇特定的端點作為報告目標。

http
Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-url/; report-to csp-endpoint

請注意,上面也指定了 report-uri 已棄用 指令,因為 report-to 尚未被瀏覽器廣泛支援。

有關更多示例,請參閱內容安全策略 (CSP) 實現

規範

規範
內容安全策略級別 3
# csp-header

瀏覽器相容性

另見