HTTP 的內容安全策略(CSP)
本文介紹的是W3C的Content Security Policy,簡稱CSP。顧名思義,這個規範與內容安全有關,主要是用來定義頁面可以載入哪些資源,減少XSS的發生。
Chrome擴充套件已經引入了CSP,通過manifest.json中的content_security_policy欄位來定義。一些現代瀏覽器也支援通過響應頭來定義CSP。下面我們主要介紹如何通過響應頭來使用CSP,Chrome擴充套件中CSP的使用可以參考Chrome官方文件。
瀏覽器相容性
早期的Chrome是通過X-WebKit-CSP響應頭來支援CSP的,而firefox和IE則支援X-Content-Security-Policy,Chrome25和Firefox23開始支援標準的的Content-Security-Policy,見下表。
響應頭 | Chrome | Firefox | Safari | IE |
---|---|---|---|---|
Content-Security-Policy | 25+ | 23+ | - | - |
X-Content-Security-Policy | - | 4.0+ | - | 10.0(有限的) |
X-Webkit-CSP | 14+ | - | 6+ | - |
完整的瀏覽器CSP支援情況請移步CanIUse。
如何使用
要使用CSP,只需要服務端輸出類似這樣的響應頭就行了:
Content-Security-Policy: default-src 'self'
default-src是CSP指令,多個指令之間用英文分號分割;’self’是指令值,多個指令值用英文空格分割。目前,有這些CSP指令:
指令 | 指令值示例 | 說明 |
---|---|---|
default-src | ‘self’ cnd.a.com | 定義針對所有型別(js、image、css、web font,ajax請求,iframe,多媒體等)資源的預設載入策略,某型別資源如果沒有單獨定義策略,就使用預設的。 |
script-src | ‘self’ js.a.com | 定義針對JavaScript的載入策略。 |
style-src | ‘self’ css.a.com | 定義針對樣式的載入策略。 |
img-src | ‘self’ img.a.com | 定義針對圖片的載入策略。 |
connect-src | ‘self’ | 針對Ajax、WebSocket等請求的載入策略。不允許的情況下,瀏覽器會模擬一個狀態為400的響應。 |
font-src | font.a.com | 針對Web Font的載入策略。 |
object-src | ‘self’ | 針對<object>、<embed>或<applet>等標籤引入的flash等外掛的載入策略。 |
media-src | media.a.com | 針對<audio>或<video>等標籤引入的html多媒體的載入策略。 |
frame-src | ‘self’ | 針對frame的載入策略。 |
sandbox | allow-forms | 對請求的資源啟用sandbox(類似於iframe的sandbox屬性)。 |
report-uri | /report-uri | 告訴瀏覽器如果請求的資源不被策略允許時,往哪個地址提交日誌資訊。 特別的:如果想讓瀏覽器只彙報日誌,不阻止任何內容,可以改用Content-Security-Policy-Report-Only頭。 |
指令值可以由下面這些內容組成:
指令值 | 指令示例 | 說明 |
---|---|---|
img-src | 允許任何內容。 | |
‘none’ | img-src ‘none’ | 不允許任何內容。 |
‘self’ | img-src ‘self’ | 允許來自相同來源的內容(相同的協議、域名和埠)。 |
data | img-src data | 允許data:協議(如base64編碼的圖片)。 |
www.a.com | img-src img.a.com | 允許載入指定域名的資源。 |
*.a.com | img-src *.a.com | 允許載入a.com任何子域的資源。 |
https://img.com | img-src https://img.com | 允許載入img.com的https資源(協議需匹配)。 |
https: | img-src https: | 允許載入https資源。 |
‘unsafe-inline’ | script-src ‘unsafe-inline’ | 允許載入inline資源(例如常見的style屬性,onclick,inline js和inline css等等)。 |
‘unsafe-eval’ | script-src ‘unsafe-eval’ | 允許載入動態js程式碼,例如eval()。 |
從上面的介紹可以看到,CSP協議可以控制的內容非常多。而且如果不特別指定’unsafe-inline’時,頁面上所有inline的樣式和指令碼都不會執行;不特別指定’unsafe-eval’,頁面上不允許使用new Function,setTimeout,eval等方式執行動態程式碼。在限制了頁面資源來源之後,被XSS的風險確實小不少。
當然,僅僅依靠CSP來防範XSS是遠遠不夠的,不支援全部瀏覽器是它的硬傷。不過,鑑於低廉的開發成本,加上也沒什麼壞處。如果擔心影響面太大,也可以像下面這樣,僅收集不匹配規則的日誌,先觀察下:
Content-Security-Policy-Report-Only: script-src 'self'; report-uri http://test/
這樣,如果頁面上有inline的JS,依然會執行,只是瀏覽器會向指定地址傳送一個post請求,包含這樣的資訊:
{"csp-report":{"document-uri":"http://test/test.php","referrer":"","violated-directive":"script-src 'self'","original-policy":"script-src 'self'; report-uri http://test/","blocked-uri":""}}
相關文章
- Web 安全之內容安全策略 (CSP)Web
- 瀏覽器安全策略說之內容安全策略CSP瀏覽器
- head頭—內容安全策略(Content Security Policy, CSP)
- 內容安全策略(CSP),防禦 XSS 攻擊的好助手
- http協議內容HTTP協議
- 全面解讀Http(HTTP內容分發)HTTP
- http之CSPHTTP
- WEB應用內容安全策略(Content Security Policy)Web
- PHP獲取HTTP body內容的方法PHPHTTP
- 8.1日CSP-J初賽內容總結
- 8.2日CSP-J初賽內容總結
- 8.3日CSP-J初賽內容總結
- HTTP的協議頭內容的認識HTTP協議
- HTTP 報文結構和內容HTTP
- win2003伺服器的相關安全策略的內容伺服器
- [譯][草案] HTTP “帶外”內容編碼HTTP
- 使用utl_http獲取某個http頁面內容HTTP
- golang 設定 http response 響應頭的內容與坑GolangHTTP
- HTTP 內容編碼,也就這 2 點需要知道 | 實用 HTTPHTTP
- 對於HTTP過程中POST內容加密的解決方案HTTP加密
- 用於快取http介面內容的gin高效能中介軟體快取HTTP
- 『言善信』Fiddler工具 — 2、HTTP請求內容詳解HTTP
- Bootstrap 包的內容boot
- 以後的內容......
- toapi:抓取任意網頁內容並提供 HTTP API獲取資料API網頁HTTP
- 03 前端HTTP協議(圖解HTTP) 之 HTTP報文內的HTTP資訊前端HTTP協議圖解
- jquery實現的設定指定元素的文字內容和html內容jQueryHTML
- div中的內容居中
- 黑馬PM-內容專案-內容管理
- 《圖解HTTP》讀書筆記三:HTTP 報文內的 HTTP 資訊圖解HTTP筆記
- 網際網路內容產業報告:內容付費崛起,優質內容為王產業
- 這裡將不再更新內容,大量資料請到http://zhulch.itpub.netHTTP
- 在oracle中通過utl_http獲得指定網頁內容,支援中文OracleHTTP網頁
- 前端內容概述前端
- 修改Jar內容JAR
- 測試內容
- 違規內容
- 好的前端內容部落格前端