?
This document uses PHP Chinese website manual Release
內(nèi)容安全策略(CSP)是一個附加的安全層,有助于檢測和緩解某些類型的攻擊,包括跨站點(diǎn)腳本(XSS)和數(shù)據(jù)注入攻擊。這些攻擊用于從數(shù)據(jù)竊取到網(wǎng)站污損或惡意軟件分發(fā)的所有事情。
CSP被設(shè)計(jì)為完全向后兼容(除CSP版本2,其中有在向后兼容性一些明確提到的不一致性;更多的細(xì)節(jié)在這里第1.1節(jié))。不支持它的瀏覽器仍然支持實(shí)現(xiàn)它的服務(wù)器,反之亦然:不支持CSP的瀏覽器完全忽略它,像往常一樣運(yùn)行,默認(rèn)為Web內(nèi)容的標(biāo)準(zhǔn)同源策略。如果站點(diǎn)不提供CSP頭,瀏覽器同樣使用標(biāo)準(zhǔn)的同源策略。
要啟用CSP,您需要配置您的Web服務(wù)器以返回Content-Security-Policy
HTTP標(biāo)頭(有時您會看到X-Content-Security-Policy
標(biāo)題的提及,但這是舊版本,不需要再指定)。
或者,該<meta>
元素可用于配置策略,例如:<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
CSP的主要目標(biāo)是減輕和報(bào)告XSS攻擊。XSS攻擊利用瀏覽器對從服務(wù)器接收的內(nèi)容的信任。惡意腳本由受害者的瀏覽器執(zhí)行,因?yàn)闉g覽器信任內(nèi)容的來源,即使它不是來自它應(yīng)該來自的地方。
CSP使服務(wù)器管理員可以通過指定瀏覽器應(yīng)該認(rèn)為是可執(zhí)行腳本的有效來源的域來減少或消除XSS可能發(fā)生的向量。然后,兼容CSP的瀏覽器將僅執(zhí)行從從這些列入白名單的域接收的源文件中加載的腳本,而忽略所有其他腳本(包括內(nèi)聯(lián)腳本和事件處理HTML屬性)。
作為最終的保護(hù)形式,希望永遠(yuǎn)不允許腳本執(zhí)行的站點(diǎn)可以選擇全局禁止腳本執(zhí)行。
除了限制可以加載內(nèi)容的域外,服務(wù)器還可以指定允許使用哪些協(xié)議; 例如(理想情況下,從安全角度來看),服務(wù)器可以指定必須使用HTTPS加載所有內(nèi)容。完整的數(shù)據(jù)傳輸安全策略不僅包括對數(shù)據(jù)傳輸實(shí)施HTTPS,還包括使用安全標(biāo)記對所有Cookie進(jìn)行標(biāo)記,并提供從HTTP頁面到其HTTPS對等方的自動重定向。網(wǎng)站也可能使用Strict-Transport-Security
HTTP標(biāo)頭來確保瀏覽器僅通過加密通道連接到它們。
配置內(nèi)容安全策略包括將Content-Security-Policy
HTTP頭添加到網(wǎng)頁,并為其提供值以控制允許用戶代理為該頁加載的資源。例如,上傳和顯示圖像的頁面可能允許來自任何地方的圖像,但將表單操作限制為特定的端點(diǎn)。正確設(shè)計(jì)的內(nèi)容安全策略有助于保護(hù)頁面免受跨站點(diǎn)腳本攻擊。本文解釋了如何正確構(gòu)建這些頭文件,并提供了示例。
您可以使用Content-Security-Policy
HTTP標(biāo)頭指定您的策略,如下所示:
Content-Security-Policy: policy
該策略是一個包含描述您的內(nèi)容安全策略的策略指令的字符串。
使用一系列策略指令來描述策略,每個策略指令都描述特定資源類型或策略區(qū)域的策略。你的策略應(yīng)該包含一個default-src
策略指令,當(dāng)它們沒有自己的策略時,它就是其他資源類型的回退(完整列表請參閱default-src
指令的描述)。策略需要包含一個default-src
或script-src
指令以防止內(nèi)聯(lián)腳本運(yùn)行,并阻止使用eval()
。策略需要包含一個default-src
或style-src
指令,以限制從<style>
元素或style
屬性應(yīng)用內(nèi)聯(lián)樣式。
本節(jié)提供了一些常見安全策略方案的示例。
網(wǎng)站管理員希望所有內(nèi)容都來自網(wǎng)站本身(不包括子域名)。
內(nèi)容安全策略:default-src'self'
網(wǎng)站管理員希望允許來自受信任域及其所有子域的內(nèi)容(它不必與CSP設(shè)置的域相同)。
內(nèi)容安全策略: default-src 'self' *.trusted.com
網(wǎng)站管理員希望允許Web應(yīng)用程序的用戶將來自任何來源的圖像包含在自己的內(nèi)容中,但要將音頻或視頻媒體限制為可信任的提供者,并且僅將所有腳本限制在承載受信任代碼的特定服務(wù)器上。
內(nèi)容安全策略: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
在此,默認(rèn)情況下,僅允許來自文檔來源的內(nèi)容,但以下情況除外:
圖像可能從任何地方加載(請注意“*”通配符)。
媒體只允許來自media1.com和media2.com(而不是來自這些網(wǎng)站的子域)。
可執(zhí)行腳本只允許來自userscripts.example.com。
網(wǎng)上銀行網(wǎng)站的網(wǎng)站管理員希望確保使用SSL加載其所有內(nèi)容,以防止攻擊者竊聽請求。
內(nèi)容安全策略:default-src https://onlinebanking.jumbobank.com
服務(wù)器僅允許訪問通過單一來源onlinebanking.jumbobank.com通過HTTPS加載的文檔。
Web郵件網(wǎng)站的網(wǎng)站管理員希望允許在電子郵件中使用HTML,以及從任何地方加載圖像,但不能使用JavaScript或其他潛在危險(xiǎn)的內(nèi)容。
內(nèi)容安全策略: default-src 'self' *.mailsite.com; img-src *
請注意,這個例子沒有指定一個script-src
; 在示例CSP中,該站點(diǎn)使用default-src
指令指定的設(shè)置,這意味著腳本只能從源服務(wù)器加載。
為了簡化部署,可以將CSP部署為僅限報(bào)告模式。該策略未被強(qiáng)制執(zhí)行,但任何違規(guī)都會報(bào)告給提供的URI。此外,只有報(bào)告的標(biāo)題可用于測試未來的政策修訂版本,而無需實(shí)際部署。
您可以使用Content-Security-Policy-Report-Only
HTTP標(biāo)頭指定您的策略,如下所示:
內(nèi)容安全策略報(bào)告:策略
如果Content-Security-Policy-Report-Only
標(biāo)題和Content-Security-Policy
標(biāo)題都出現(xiàn)在相同的響應(yīng)中,則兩個策略都會得到遵守。策略生成報(bào)告時Content-Security-Policy
強(qiáng)制執(zhí)行頭中指定的Content-Security-Policy-Report-Only
策略,但未強(qiáng)制實(shí)施。
如果策略包含有效的report-uri
指令,那么支持CSP的瀏覽器會始終發(fā)送違規(guī)報(bào)告,以便違反您建立的策略。
默認(rèn)情況下,不發(fā)送違規(guī)報(bào)告。要啟用違規(guī)報(bào)告,您需要指定report-uri
策略指令,至少提供一個要將報(bào)告發(fā)送到的URI:
內(nèi)容安全策略: default-src 'self'; report-uri http://reportcollector.example.com/collector.cgi
然后,您需要設(shè)置您的服務(wù)器以接收報(bào)告; 它可以以您認(rèn)為合適的方式存儲或處理它們。
報(bào)告JSON對象包含以下數(shù)據(jù):
document-uri
發(fā)生違規(guī)的文檔的URI。referrer
違規(guī)發(fā)生的文件的referrer。blocked-uri
內(nèi)容安全策略阻止加載的資源的URI。如果阻止的URI來自與document-uri不同的來源,則阻止的URI將被截?cái)嘁詢H包含方案,主機(jī)和端口。violated-directive
違反政策部分的名稱。original-policy
原始策略由Content-Security-Policy
HTTP頭指定。
讓我們考慮一個位于的頁面http://example.com/signup.html
。它使用以下策略,禁止除了樣式表之外的所有內(nèi)容cdn.example.com
。
內(nèi)容安全策略: default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports
HTML的signup.html
外觀如下所示:
<!DOCTYPE html><html> <head> <title>Sign Up</title> <link rel="stylesheet" href="css/style.css"> </head> <body> ... Content ... </body></html>
你能發(fā)現(xiàn)錯誤嗎?樣式表只允許加載cdn.example.com
,但網(wǎng)站嘗試從它自己的原點(diǎn)加載一個(http://example.com
)。能夠執(zhí)行CSP的瀏覽器將下列違規(guī)報(bào)告作為POST請求發(fā)送至http://example.com/_/csp-reports
訪問文檔時:
{ "csp-report": { "document-uri": "http://example.com/signup.html", "referrer": "", "blocked-uri": "http://example.com/css/style.css", "violated-directive": "style-src cdn.example.com", "original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports" }}
正如您所看到的,報(bào)告包含違規(guī)資源的完整路徑blocked-uri
。這并非總是如此。例如,當(dāng)signup.html
試圖從中加載CSS時http://anothercdn.example.com/stylesheet.css
,瀏覽器將不包含完整路徑,而只包含origin(http://anothercdn.example.com
)。CSP規(guī)范給出了這種奇怪行為的解釋。總之,這是為了防止泄露有關(guān)跨源資源的敏感信息。
特征 | 谷歌 | Edge | 火狐 | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Content-Security-Policy | 251 | 14 | 23.02 | 103 | 15 | 74 |
base-uri | 40 | No | 35.0 | No | 27 | 10 |
block-all-mixed-content | (Yes) | ? | 48.0 | No | (Yes) | ? |
child-src | 40 | No | 45.0 | No | 27 | 10 |
connect-src | 25 | 14 | 23.06 | No | 15 | 7 |
default-src | 25 | 14 | 23.0 | No | 15 | 7 |
disown-opener | No | No | No | No | No | No |
font-src | 25 | 14 | 23.0 | No | 15 | 7 |
form-action | 40 | No | 36.0 | No | 27 | 10 |
frame-ancestors | 40 | No | 33.0 | No | 26 | 10 |
frame-src | 25 | 14 | 23.0 | No | 15 | 7 |
img-src | 25 | 14 | 23.0 | No | 15 | 7 |
manifest-src | (Yes) | No | 41.0 | No | (Yes) | No |
media-src | 25 | 14 | 23.0 | No | 15 | 7 |
navigation-to | No | No | No | No | No | No |
object-src | 25 | 14 | 23.0 | No | 15 | 7 |
plugin-types | 40 | No | No7 | No | 27 | 10 |
referrer | 33 — 56 | No | 37.08 | No | (Yes) — 43 | No |
report-sample | 59 | ? | ? | ? | 46 | ? |
report-to | No | No | No | No | No | No |
report-uri | 25 | 14 | 23.0 | No | 15 | 7 |
require-sri-for | 54 | No | 49.0 | No | 41 | No |
sandbox | 25 | 14 | 50.0 | 10 | 15 | 7 |
script-src | 25 | 14 | 23.0 | No | 15 | 7 |
strict-dynamic | 52 | No | 52.0 | No | 39 | No |
style-src | 25 | 14 | 23.0 | No | 15 | 7 |
upgrade-insecure-requests | 43 | No9 | 42.0 | No | 30 | No |
worker-src | 59 | No | No10 | No | 48 | No |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Content-Security-Policy | (Yes) | (Yes) | (Yes) | 23.0 | ? | ? | 7.15 |
base-uri | (Yes) | (Yes) | No | 35.0 | No | ? | 9.3 |
block-all-mixed-content | (Yes) | (Yes) | ? | 48.0 | No | ? | ? |
child-src | (Yes) | (Yes) | No | 45.0 | No | ? | 9.3 |
connect-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
default-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
disown-opener | No | No | No | No | No | No | No |
font-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
form-action | (Yes) | (Yes) | No | 36.0 | No | ? | 9.3 |
frame-ancestors | ? | (Yes) | No | 33.0 | No | ? | 9.3 |
frame-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
img-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
manifest-src | (Yes) | (Yes) | No | 41.0 | No | ? | No |
media-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
navigation-to | No | No | No | No | No | No | No |
object-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
plugin-types | (Yes) | (Yes) | No | No | No | ? | 9.3 |
referrer | 33 — 56 | 33 — 56 | No | 37.08 | No | (Yes) — 43 | No |
report-sample | 59 | 59 | ? | ? | ? | 46 | ? |
report-to | No | No | No | No | No | No | No |
report-uri | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
require-sri-for | 54 | 54 | No | 49.0 | No | 41 | No |
sandbox | (Yes) | (Yes) | ? | 50.0 | 10 | ? | 7.1 |
script-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
strict-dynamic | 52 | 52 | No | No | No | 39 | No |
style-src | (Yes) | (Yes) | ? | 23.0 | No | ? | 7.1 |
upgrade-insecure-requests | 43 | 43 | No | 42.0 | No | 30 | No |
worker-src | 59 | 59 | No | No | No | 48 | No |
1.在Chrome 14中作為X-Webkit-CSP標(biāo)頭實(shí)現(xiàn)。
2.在Firefox 4中作為X-Content-Security-Policy頭部實(shí)施。
3.作為X-Content-Security-Policy頭部實(shí)現(xiàn),只支持'sandbox'指令。
4.在Safari 6中實(shí)現(xiàn)為X-Webkit-CSP頭。
5.在iOS 5.1中作為X-Webkit-CSP頭部實(shí)現(xiàn)。
6.在Firefox 50之前,<a>元素的ping屬性未被connect-src覆蓋。
7.請參閱Bugzilla錯誤1045899。
8.將被刪除,請參閱Bugzilla錯誤1302449。
9.正考慮未來發(fā)布。
10.參見Bugzilla錯誤1302667。
內(nèi)容安全政策
內(nèi)容安全政策只讀報(bào)告
WebExtensions中的內(nèi)容安全性
在Firefox開發(fā)者工具中顯示安全和隱私政策