新聞中心
內(nèi)容安全策略(CSP)是一個(gè) HTTP Header,CSP 通過告訴瀏覽器一系列規(guī)則,嚴(yán)格規(guī)定頁面中哪些資源允許有哪些來源, 不在指定范圍內(nèi)的統(tǒng)統(tǒng)拒絕。

使用它是防止跨站點(diǎn)腳本(XSS)漏洞的最佳方法。由于難以使用 CSP 對(duì)現(xiàn)有網(wǎng)站進(jìn)行改造(可通過漸進(jìn)式的方法),因此 CSP 對(duì)于所有新網(wǎng)站都是強(qiáng)制性的,強(qiáng)烈建議對(duì)所有現(xiàn)有高風(fēng)險(xiǎn)站點(diǎn)進(jìn)行 CSP 策略配置。
為什么要配置
CSP 的主要好處就是可以全面禁止使用不安全的嵌入式 JavaScript。內(nèi)聯(lián) JavaScript(無論是反射的還是存儲(chǔ)的),意味著不正確的轉(zhuǎn)義用戶輸入都可以被 Web 瀏覽器解釋為 JavaScript 代碼。通過使用 CSP 禁用嵌入式 JavaScript,你可以有效消除針對(duì)你站點(diǎn)的幾乎所有 XSS 攻擊。
注意,禁用內(nèi)聯(lián) JavaScript 意味著必須從 src 標(biāo)記加載所有 JavaScript
頁面 HTTP 響應(yīng)頭的 Content-Security-Policy配置中包含相同的加密串:
- Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
配置示例
示例 1
所有內(nèi)容均來自站點(diǎn)的同一個(gè)源 (不包括其子域名)
Content-Security-Policy: default-src 'self'
示例 2
允許內(nèi)容來自信任的域名及其子域名 (域名不必須與CSP設(shè)置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
示例 3
允許網(wǎng)頁應(yīng)用的用戶在他們自己的內(nèi)容中包含來自任何源的圖片, 但是限制音頻或視頻需從信任的資源提供者(獲得),所有腳本必須從特定主機(jī)服務(wù)器獲取可信的代碼.
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
在這里,各種內(nèi)容默認(rèn)僅允許從文檔所在的源獲取, 但存在如下例外:
- 圖片可以從任何地方加載(注意 "*" 通配符)。
- 多媒體文件僅允許從 media1.com 和 media2.com 加載(不允許從這些站點(diǎn)的子域名)。
- 可運(yùn)行腳本僅允許來自于userscripts.example.com。
示例 4
一個(gè)線上銀行網(wǎng)站的管理者想要確保網(wǎng)站的所有內(nèi)容都要通過SSL方式獲取,以避免攻擊者竊聽用戶發(fā)出的請(qǐng)求。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
該服務(wù)器僅允許通過HTTPS方式并僅從onlinebanking.jumbobank.com域名來訪問文檔。
示例 5
一個(gè)在線郵箱的管理者想要允許在郵件里包含HTML,同樣圖片允許從任何地方加載,但不允許JavaScript或者其他潛在的危險(xiǎn)內(nèi)容(從任意位置加載)。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
注意這個(gè)示例并未指定script-src。在此CSP示例中,站點(diǎn)通過 default-src 指令的對(duì)其進(jìn)行配置,這也同樣意味著腳本文件僅允許從原始服務(wù)器獲取。
上報(bào)你的數(shù)據(jù)
當(dāng)檢測(cè)到非法資源時(shí),除了控制臺(tái)看到的報(bào)錯(cuò)信息,也可以讓瀏覽器將日志發(fā)送到服務(wù)器以供后續(xù)分析使用。接收?qǐng)?bào)告的地址可在 Content-Security-Policy 響應(yīng)頭中通過 report-uri指令來配置。當(dāng)然,服務(wù)端需要編寫相應(yīng)的服務(wù)來接收該數(shù)據(jù)。
配置 report-uri
- Content-Security-Policy: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;`
服務(wù)端收到請(qǐng)求:
- {
- "csp-report": {
- "document-uri": "http://example.org/page.html",
- "referrer": "http://evil.example.com/",
- "blocked-uri": "http://evil.example.com/evil.js",
- "violated-directive": "script-src 'self' https://apis.google.com",
- "original-policy": "script-src 'self' https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser"
- }
- }
Report Only
CSP 提供了一種報(bào)告模式,該模式下資源不會(huì)真的被限制加載,只會(huì)對(duì)檢測(cè)到的問題進(jìn)行上報(bào) ,以 JSON 數(shù)據(jù)的形式發(fā)送到 report-uri 指定的地方。
通過指定 Content-Security-Policy-Report-Only 而不是 Content-Security-Policy,則開啟了報(bào)告模式。
- Content-Security-Policy-Report-Only: default-src 'self'; ...; report-uri /my_amazing_csp_report_parser;
當(dāng)然,你也可以同時(shí)指定兩種響應(yīng)頭,各自里的規(guī)則還會(huì)正常執(zhí)行,不會(huì)互相影響。比如:
- Content-Security-Policy: img-src *;
- Content-Security-Policy-Report-Only: img-src ‘none’; report-uri http://reportcollector.example.com/collector.cgi
這里圖片還是會(huì)正常加載,但是 img-src ‘none’ 也會(huì)檢測(cè)到并且發(fā)送報(bào)告。
報(bào)告模式對(duì)于測(cè)試非常有用。在開啟 CSP 之前肯定需要對(duì)整站做全面的測(cè)試,將發(fā)現(xiàn)的問題及時(shí)修復(fù)后再真正開啟,比如上面提到的對(duì)內(nèi)聯(lián)代碼的改造。
如何檢驗(yàn)配置成功了?
在Network中可以看到配置成功的header:
下面是 Twitter 的一個(gè)配置示例,非常完善:
在控制臺(tái)可以看到資源 block 報(bào)錯(cuò):
Network中可以看到Block資源上報(bào):
網(wǎng)頁名稱:為什么你的網(wǎng)頁需要CSP?
網(wǎng)站鏈接:http://www.dlmjj.cn/article/cdiddgh.html


咨詢
建站咨詢
