?
This document uses PHP Chinese website manual Release
HTTP Content-Security-Policy
(CSP)script-src
指令為JavaScript的源指定有效來源。這不僅包括直接加載到<script>
元素中的URL ,還包括可以觸發(fā)腳本執(zhí)行的內(nèi)聯(lián)腳本事件處理程序(onclick
)和XSLT樣式表等內(nèi)容。
CSP版本 | 1 |
---|---|
指令類型 | 取指令 |
default-src fallback | 是。如果此指令不存在,用戶代理將查找default-src指令。 |
script-src
政策可以允許一個(gè)或多個(gè)來源:
Content-Security-Policy: script-src <source>;Content-Security-Policy: script-src <source> <source>;
<source>可以是以下之一:
通過名稱或IP地址的<host-source> Internet 主機(jī),以及可選的 URL方案 and/or 端口號(hào)。該站點(diǎn)的地址可能包含一個(gè)可選的前導(dǎo)通配符(星號(hào)字符'*'
),并且可以使用通配符(再次'*'
)作為端口號(hào),表示所有合法端口對(duì)于源都有效。
示例:
http://*.example.com
:匹配使用http:
URL方案從example.com的任何子域加載的所有嘗試。
mail.example.com:443
:匹配所有嘗試訪問mail.example.com上的端口443的嘗試。
https://store.example.com
:匹配所有嘗試訪問store.example.com使用https:
。
<scheme-source>一種模式,如'http:' 或 'https:'。冒號(hào)是必需的,不應(yīng)使用單引號(hào)。您也可以指定數(shù)據(jù)模式(不推薦)。
data:
允許將data:
URI用作內(nèi)容源。這是不安全的; 攻擊者也可以注入任意數(shù)據(jù):URI。謹(jǐn)慎使用這一點(diǎn),絕對(duì)不適用于腳本。
mediastream:
允許將mediastream:
URI用作內(nèi)容源。
blob:
允許將blob:
URI用作內(nèi)容源。
filesystem:
允許將filesystem:
URI用作內(nèi)容源。
'self'
指受保護(hù)文檔的來源,包括相同的URL方案和端口號(hào)。你必須包括單引號(hào)。一些瀏覽器特別排除blob
和filesystem
從源指令。需要允許這些內(nèi)容類型的網(wǎng)站可以使用Data屬性來指定它們。
'unsafe-inline'
允許使用內(nèi)聯(lián)資源,如內(nèi)聯(lián)<script>
元素,javascript:
URL,內(nèi)聯(lián)事件處理程序和內(nèi)聯(lián)<style>
元素。你必須包括單引號(hào)。
'unsafe-eval'
允許使用eval()
和類似的方法從字符串創(chuàng)建代碼。你必須包括單引號(hào)。
'none'
指空集;也就是說,沒有URL匹配。單引號(hào)是必需的。'nonce- <base64-value>'使用加密隨機(jī)數(shù)(使用一次的數(shù)字)的特定內(nèi)聯(lián)腳本的白名單。每次發(fā)送策略時(shí),服務(wù)器都必須生成唯一的隨機(jī)數(shù)值。提供一個(gè)無法猜測(cè)的隨機(jī)數(shù)是非常重要的,因?yàn)槔@過資源的策略是微不足道的。例如,查看不安全的內(nèi)聯(lián)腳本。
<hash-source>腳本或樣式的sha256,sha384或sha512散列。此源的使用由兩部分組成:用短劃線分隔的部分:用于創(chuàng)建散列的加密算法以及腳本或樣式的base64編碼散列。生成散列時(shí),不要包含<script>或<style>標(biāo)記,并注意大小寫和空白字符,包括前導(dǎo)或尾隨空格。有關(guān)示例,請(qǐng)參閱不安全的內(nèi)聯(lián)腳本。在CSP 2.0中,這僅適用于內(nèi)聯(lián)腳本。CSP 3.0允許它的情況下script-src
用于外部腳本。
'strict-dynamic' strict-dynamic
源表達(dá)式指定顯式給予標(biāo)記中存在的腳本的信任,通過附加一個(gè)隨機(jī)數(shù)或散列,應(yīng)該傳播給由該腳本加載的所有腳本。與此同時(shí),任何白名單或源表達(dá)式(例如'self'
或'unsafe-inline'
將被忽略)。請(qǐng)參閱script-src作為示例?!皉eport-sample”需要將違規(guī)代碼樣本包含在違規(guī)報(bào)告中。
鑒于此CSP標(biāo)題:
Content-Security-Policy: script-src https://example.com/
以下腳本被阻止并且不會(huì)被加載或執(zhí)行:
<script src="https//not-example.com/js/library.js"></script>
請(qǐng)注意,嵌入式事件處理程序也被阻止:
<button id="btn" onclick="doSomething()">
你應(yīng)該用addEventListener
調(diào)用代替:
document.getElementById("btn").addEventListener('click', doSomething);
注意:禁止內(nèi)聯(lián)樣式和內(nèi)聯(lián)腳本是CSP提供的最大安全勝利之一。但是,如果你絕對(duì)必須使用它,有幾個(gè)機(jī)制可以允許它們。
要允許內(nèi)聯(lián)腳本和內(nèi)聯(lián)事件處理程序,'unsafe-inline'
可以指定與內(nèi)聯(lián)塊匹配的 nonce-source 或 hash-source。
Content-Security-Policy: script-src 'unsafe-inline';
上述內(nèi)容安全策略將允許內(nèi)聯(lián)<script>
元素
<script> var inline = 1; </script>
您可以使用nonce-source來僅允許特定的內(nèi)聯(lián)腳本塊:
Content-Security-Policy: script-src 'nonce-2726c7f26c'
您將不得不在<script>
元素上設(shè)置相同的隨機(jī)數(shù):
<script nonce="2726c7f26c"> var inline = 1;</script>
或者,您可以從內(nèi)聯(lián)腳本創(chuàng)建散列。CSP支持sha256,sha384和sha512。
Content-Security-Policy: script-src 'sha256-076c8f1ca6979ef156b510a121b69b6265011597557ca2971db5ad5a2743545f'
生成散列時(shí),不要包含<script>
標(biāo)記,并注意大小寫和空白字符,包括前導(dǎo)或尾隨空白。
<script>var inline = 1;</script>
所述'unsafe-eval'
源表達(dá)控制該創(chuàng)建從串代碼幾個(gè)腳本執(zhí)行方法。如果'unsafe-eval'
未用script-src
指令指定,則以下方法被阻止并不會(huì)產(chǎn)生任何影響:
eval()
Function()
當(dāng)傳遞一個(gè)字符串文字就像這樣的方法: window.setTimeout("alert(\"Hello World!\");", 500);
window.setTimeout
window.setInterval
window.setImmediate
window.execScript
(IE <11)
strict-dynamic
'strict-dynamic
'源表達(dá)指定明確給出與存在于標(biāo)記的腳本,通過用隨機(jī)數(shù)或散列伴隨它的信任,應(yīng)當(dāng)被傳播到由根腳本加載的所有腳本。與此同時(shí),任何白名單或源表達(dá)式(例如'self'
或'unsafe-inline'
將被忽略)。例如,一種策略script-src 'strict-dynamic' 'nonce-R4nd0m' https://whitelisted.com/
可以允許加載根腳本<script nonce="R4nd0m" src="https://example.com/loader.js">
并將該信任傳播給由其加載的任何腳本loader.js
,但不允許加載腳本https://whitelisted.com/
。
script-src 'strict-dynamic' 'nonce-someNonce'
要么
script-src 'strict-dynamic' 'sha256-hash'
可以以strict-dynamic
向后兼容的方式進(jìn)行部署,而不需要用戶代理嗅探。
政策:
script-src 'unsafe-inline' https: 'nonce-abcdefg' 'strict-dynamic'
將'unsafe-inline' https:
在支持CSP1 https: 'nonce-abcdefg'
的瀏覽器,支持CSP2的'nonce-abcdefg' 'strict-dynamic'
瀏覽器以及支持CSP3的瀏覽器中發(fā)揮作用。
規(guī)范 | 狀態(tài) | 評(píng)論 |
---|---|---|
內(nèi)容安全策略級(jí)別3該規(guī)范中'script-src'的定義。 | 編輯草稿 | 沒有變化。 |
內(nèi)容安全策略級(jí)別2該規(guī)范中'script-src'的定義。 | 建議 | 初始定義。 |
特征 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基本支持 | 25 | 14 | 23.0 | No | 15 | 7 |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | 4.4 | (Yes) | ? | 23.0 | No | ? | 7.1 |