Web 安全之 CSP (內容安全策略) 和 SRI(子資源完整性)

CSPSRI 能夠預防XSS攻擊數據包嗅探攻擊html

Content-Security-Policy (內容安全策略)

來自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":策略字符串
複製代碼

資源限制能夠精細到 imgfontstyleframe等粒度。網絡

default-src

Content-Security-Policy: default-src 'self'
複製代碼

一個網站管理者想要全部內容均來自站點的同一個源 (不包括其子域名),詳細 Content-Security-Policy/default-src函數

media-src 、 img-src、script-src

Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
複製代碼

在這裏,各類內容默認僅容許從文檔所在的源獲取, 但存在以下例外:工具

  • 圖片能夠從任何地方加載(注意 "*" 通配符)。
  • 多媒體文件僅容許從 media1.com 和 media2.com 加載(不容許從這些站點的子域名)。
  • 可運行腳本僅容許來自於userscripts.example.com。

'unsafe-eval'

容許使用 eval() 以及類似的函數來從字符串建立代碼。必須有單引號。

更多策略見 CSP directives

常見網站設置

  • 知乎

  • Twitter

Subresource Integrity(子資源完整性)

子資源完整性(SRI) 是容許瀏覽器檢查其得到的資源(例如從 CDN 得到的)是否被篡改的一項安全特性。它經過驗證獲取文件的哈希值是否和你提供的哈希值同樣來判斷資源是否被篡改。

不少時候咱們使用CDN多個站點之間共享了腳本和樣式,以便提升網站性能節省寬帶。然而也存在風險,若是攻擊者獲取了CDN的控制權,就能夠將任意內容惡意注入到CDN文件中,從而攻擊了加載此CDN資源的站點。因此就須要 SRI 來確保Web應用程序得到的文件未通過第三方注入或者其餘形式的修改來下降被攻擊的風險。

SRI 原理

將文件內容經過 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 屬性,且經過驗證才能被加載。

因此,只要文件變化了,瀏覽器就不會執行,有效避免了腳本攻擊。


參考連接


關於本文

相關文章
相關標籤/搜索