內容安全策略

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

有關更多資訊,請參閱有關 內容安全策略 (CSP) 的介紹性文章。

頭型別 響應頭
禁止的頭名稱

語法

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

其中 <policy-directive> 由:<directive> <value> 組成,沒有內部標點符號。

指令

獲取指令

獲取指令 控制可以從哪些位置載入某些資源型別。

child-src

定義了使用元素(如 <frame><iframe>)載入的 Web 工作執行緒 和巢狀瀏覽上下文的有效來源。

警告:如果您想規範巢狀瀏覽上下文和工作執行緒,請勿使用 child-src,而應分別使用 frame-srcworker-src 指令。

connect-src

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

default-src

用作其他 獲取指令 的後備。

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> 元素的有效來源。

注意:object-src 控制的元素或許是巧合地被認為是傳統 HTML 元素,並且沒有收到新的標準化功能(例如,<iframe> 的安全屬性 sandboxallow)。因此,建議限制此獲取指令(例如,如果可能,顯式設定 object-src 'none')。

prefetch-src 已棄用 非標準

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

script-src

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

script-src-elem

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

script-src-attr

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

style-src

指定樣式表的有效來源。

style-src-elem

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

style-src-attr

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

worker-src

指定 WorkerSharedWorkerServiceWorker 指令碼的有效來源。

文件指令

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

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)視為已替換為安全 URL(透過 HTTPS 提供的 URL)。此指令旨在用於具有大量不安全傳統 URL 的網站,這些 URL 需要被重寫。

已棄用指令

block-all-mixed-content 已棄用

防止在使用 HTTPS 載入頁面時使用 HTTP 載入任何資產。

report-uri 已棄用

為瀏覽器提供一個 URL,用於傳送 CSP 違規報告。這已被 report-to 指令取代。

允許的值概述如下。有關詳細參考,請參見 CSP 源值 以及各個指令的文件。

關鍵字值

'none'

不允許載入任何資源。

'self'

僅允許來自當前來源的資源。

'strict-dynamic'

由於附帶的 nonce 或雜湊,頁面中指令碼獲得的信任會擴充套件到它載入的指令碼。

'report-sample'

要求在違規報告中包含違規程式碼的樣本。

'inline-speculation-rules'

允許在指令碼中包含 推測規則(另請參見 <script type="speculationrules">)。

不安全關鍵字值

'unsafe-inline'

允許使用內聯資源。

'unsafe-eval'

允許使用動態程式碼評估,例如 evalsetTimeout()window.execScript 非標準 .

'unsafe-hashes'

允許啟用特定的內聯事件處理程式。

'wasm-unsafe-eval'

允許載入和執行 WebAssembly 模組,而無需透過 'unsafe-eval' 允許不安全的 JavaScript 執行。單引號是必需的。

主機值

  • Host
    • 僅允許載入來自特定主機的資源,具有可選的方案、埠和路徑。例如,example.com*.example.comhttps://*.example.com:12/path/to/file.js
    • CSP 中以 / 結尾的路徑部分將匹配它們是字首的任何路徑。例如,example.com/api/ 將匹配 example.com/api/users/new 之類的 URL。
    • CSP 中的其他路徑部分將精確匹配;例如,example.com/file.js 將匹配 http://example.com/file.jshttps://example.com/file.js,但不匹配 https://example.com/file.js/file2.js
  • 方案
    • 僅允許載入來自特定方案的資源,應始終以 ":" 結尾。例如,https:http:data: 等。

其他值

'nonce-*'

一個加密 nonce(僅使用一次)來允許指令碼。伺服器必須在每次傳輸策略時生成唯一的 nonce 值。提供一個不可猜測的 nonce 非常重要,因為否則繞過資源策略將是微不足道的。這與 指令碼標籤 nonce 屬性 結合使用。例如,nonce-DhcnhD3khTMePgXwdayK9BsMqXjhguVV

'sha*-*'

sha256、sha384 或 sha512。後面跟一個連字元,然後是 sha* 值。例如,sha256-jzgBGA4UWFFmpOBq0JpdsySukE1FrEN5bUpoK8Z29fY=

工作執行緒中的 CSP

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

唯一的例外是,如果工作者指令碼的來源是全域性唯一的識別符號(例如,如果其 URL 的方案是 data 或 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 指令。這種方法在測試期間用於報告違規,但不阻止程式碼執行。

使用 Reporting-Endpoints HTTP 響應標頭定義要將報告發送到的端點(URL)。

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

瀏覽器相容性

BCD 表僅在瀏覽器中載入

另請參閱