CSP
和 SRI
能夠預防XSS攻擊
和數據包嗅探攻擊
。html
來自MDN 的介紹git
內容安全策略(Content-Security-Policy)
是一個額外的安全層,用於檢測並削弱某些特定類型的攻擊,包括 跨站腳本 (XSS)
和數據注入攻擊
等。不管是數據盜取、網站內容污染仍是散發惡意軟件,這些攻擊都是主要的手段。github
CSP
被設計成徹底向後兼容(除CSP2
在向後兼容有明確說起的不一致; 更多細節查看這裏 章節1.1)。不支持 CSP
的瀏覽器也能與實現了 CSP
的服務器正常合做,反之亦然:不支持 CSP
的瀏覽器只會忽略它,如常運行,默認爲網頁內容使用標準的同源策略。若是網站不提供 CSP 頭部
,瀏覽器也使用標準的同源策略。瀏覽器
爲使 CSP
可用, 你須要配置你的網絡服務器返回 Content-Security-Policy
HTTP頭部 ( 有時你會看到一些關於 X-Content-Security-Policy
頭部的提法, 那是舊版本,你無須再如此指定它)。安全
HTTP Response Headers ,舉例:bash
除此以外, <meta>
元素也能夠被用來配置該策略, 例如服務器
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
複製代碼
"Content-Security-Policy":策略字符串
複製代碼
資源限制能夠精細到 img
、font
、style
、frame
等粒度。網絡
Content-Security-Policy: default-src 'self'
複製代碼
一個網站管理者想要全部內容均來自站點的同一個源 (不包括其子域名),詳細 Content-Security-Policy/default-src函數
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
複製代碼
在這裏,各類內容默認僅容許從文檔所在的源獲取, 但存在以下例外:工具
容許使用 eval() 以及類似的函數來從字符串建立代碼。必須有單引號。
更多策略見 CSP directives
子資源完整性(SRI)
是容許瀏覽器檢查其得到的資源(例如從 CDN 得到的)是否被篡改的一項安全特性。它經過驗證獲取文件的哈希值是否和你提供的哈希值同樣來判斷資源是否被篡改。
不少時候咱們使用CDN多個站點之間共享了腳本和樣式,以便提升網站性能節省寬帶。然而也存在風險,若是攻擊者獲取了CDN的控制權,就能夠將任意內容惡意注入到CDN文件中,從而攻擊了加載此CDN資源的站點。因此就須要 SRI
來確保Web應用程序得到的文件未通過第三方注入或者其餘形式的修改來下降被攻擊的風險。
將文件內容經過 base64 編碼
後的哈希值,寫入你所引用的 <script>
或 <link>
標籤的 integrity
屬性值中便可啓用子資源完整性功能。瀏覽器在加載此內容執行以前,會判斷該文件的哈希值是否和 integrity
預期的一致,只有一致纔會執行。
SRI Hash Generator 是一個在線生成 SRI 哈希值的工具。
<script src="https://example.com/example-framework.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC" crossorigin="anonymous"></script>
複製代碼
你能夠根據內容安全策略(CSP)
來配置你的服務器使得指定類型的文件遵照 SRI
。這是經過在 CSP 頭部
添加 require-sri-for
指令實現的:
Content-Security-Policy: require-sri-for script;
複製代碼
這條指令規定了全部 JavaScript
都要有 integrity 屬性,且經過驗證才能被加載。
因此,只要文件變化了,瀏覽器就不會執行,有效避免了腳本攻擊。
參考連接
關於本文