內容安全策略
HTTP 的 Content-Security-Policy 響應頭允許網站管理員控制使用者代理可以為給定頁面載入的資源。除了一些例外,策略主要涉及指定伺服器來源和指令碼端點。這有助於防禦跨站點指令碼攻擊 (跨站點指令碼).
有關更多資訊,請參閱有關 內容安全策略 (CSP) 的介紹性文章。
語法
Content-Security-Policy: <policy-directive>; <policy-directive>
其中 <policy-directive> 由:<directive> <value> 組成,沒有內部標點符號。
指令
獲取指令
獲取指令 控制可以從哪些位置載入某些資源型別。
child-src-
定義了使用元素(如
<frame>和<iframe>)載入的 Web 工作執行緒 和巢狀瀏覽上下文的有效來源。警告:如果您想規範巢狀瀏覽上下文和工作執行緒,請勿使用
child-src,而應分別使用frame-src和worker-src指令。 connect-src-
限制可以使用指令碼介面載入的 URL。
default-src-
用作其他 獲取指令 的後備。
fenced-frame-src實驗性功能-
指定載入到
<fencedframe>元素中的巢狀瀏覽上下文的有效來源。 font-src-
指定使用
@font-face載入字型的有效來源。 frame-srcimg-src-
指定影像和網站圖示的有效來源。
manifest-src-
指定應用程式清單檔案的有效來源。
media-srcobject-src-
指定
<object>和<embed>元素的有效來源。注意:受
object-src控制的元素或許是巧合地被認為是傳統 HTML 元素,並且沒有收到新的標準化功能(例如,<iframe>的安全屬性sandbox或allow)。因此,建議限制此獲取指令(例如,如果可能,顯式設定object-src 'none')。 prefetch-src已棄用 非標準-
指定要預取或預渲染的有效來源。
script-src-
指定 JavaScript 和 WebAssembly 資源的有效來源。
script-src-elem-
指定 JavaScript
<script>元素的有效來源。 script-src-attr-
指定 JavaScript 內聯事件處理程式的有效來源。
style-src-
指定樣式表的有效來源。
style-src-elemstyle-src-attr-
指定應用於各個 DOM 元素的內聯樣式的有效來源。
worker-src-
指定
Worker、SharedWorker或ServiceWorker指令碼的有效來源。
文件指令
導航指令
導航指令控制使用者可以導航到的位置或提交表單的位置,例如。
form-action-
限制可以作為給定上下文中的表單提交的目標使用的 URL。
frame-ancestors
報告指令
報告指令控制 Content-Security-Policy 和 Content-Security-Policy-Report-Only 中 CSP 違規報告的目標 URL。
report-to-
為瀏覽器提供一個令牌,用於標識要將 CSP 違規資訊傳送到的報告端點或端點組。令牌代表的端點透過其他 HTTP 標頭提供,例如
Reporting-Endpoints和Report-To已棄用 .警告:此指令旨在替換
report-uri;在支援report-to的瀏覽器中,會忽略report-uri指令。但是,在report-to廣泛支援之前,您應該指定兩個標頭,如所示(其中endpoint_name是單獨提供的端點的名稱)httpContent-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'-
允許使用動態程式碼評估,例如
eval、setTimeout()和window.execScript非標準 . 'unsafe-hashes'-
允許啟用特定的內聯事件處理程式。
'wasm-unsafe-eval'-
允許載入和執行 WebAssembly 模組,而無需透過
'unsafe-eval'允許不安全的 JavaScript 執行。單引號是必需的。
主機值
- Host
- 僅允許載入來自特定主機的資源,具有可選的方案、埠和路徑。例如,
example.com、*.example.com、https://*.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.js和https://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' 將被強制執行。
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-inline 和 unsafe-eval 指令,因此將阻止內聯指令碼。
Content-Security-Policy: default-src https:
可以使用 HTML <meta> 元素應用相同的限制。
<meta http-equiv="Content-Security-Policy" content="default-src https:" />
允許內聯程式碼和 HTTPS 資源,但停用外掛
此策略可用於在使用過多內聯程式碼無法修復的現有網站上,以確保僅透過 HTTPS 載入資源並停用外掛。
Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'
在測試時報告但不強制執行違規
此示例設定與上一個示例相同的限制,但使用 Content-Security-Policy-Report-Only 標頭和 report-to 指令。這種方法在測試期間用於報告違規,但不阻止程式碼執行。
使用 Reporting-Endpoints HTTP 響應標頭定義要將報告發送到的端點(URL)。
Reporting-Endpoints: csp-endpoint="https://example.com/csp-reports"
然後,在 CSP 策略中使用 report-to 指令選擇特定端點作為報告目標。
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 表僅在瀏覽器中載入