摘要:它使用哈希值檢查確保第三方資源的完整性。只要開發者提供了被需下載資源的哈希值,瀏覽器就可以檢查實際下載的文件是否與預期的哈希值匹配。網上也有現成的哈希值生成器,方便好用與你可以使用內容安全政策強制要求當前頁面所有腳本加載標簽啟用。
出于速度和降低服務器負載考慮,有時候我們會選擇使用 CDN 加載第三方靜態資源。對于一些熱門的第三方庫,在用戶打開你的網頁之前就很有可能在瀏覽別的網站時被瀏覽器緩存下來,這樣就可以極大的提升網頁加載速度。
然而使用 CDN 也提高了網站的安全風險:第三方靜態資源放在第三方服務器上,CDN 的擁有者有沒有可能偷偷的篡改這些文件,加入惡意代碼呢?或者 CDN 服務器遭受了黑客攻擊,整個文件被替換掉。雖然可能性不高,但不是零。JavaScript 對于當前瀏覽器頁面有完全控制權,他們不僅僅能獲取到頁面上的任何內容,還能抓取用戶輸入的一些諸如密碼之類的機密信息,還能獲取到保存到 Cookie 中的登錄票據等等內容,這就是所謂的 XSS 攻擊。
我們需要一種機制確保從 CDN 下載的文件未被惡意篡改。某些下載網站就提供下載文件的 MD5 或 SHA1 碼用于檢查所下載文件的完整性,網頁中有沒有類似的機制呢?
什么是 SRI子資源完整性 Subresource Integrity 簡稱 SRI 是一種安全機制,它用于讓瀏覽器檢查所下載的來自第三方的資源(例如 CDN)未被惡意篡改。它使用哈希值檢查確保第三方資源的完整性。只要開發者提供了被需下載資源的哈希值,瀏覽器就可以檢查實際下載的文件是否與預期的哈希值匹配。
使用 SRI只需給 script 或 style 標簽添加 integrity 屬性即可。例如:
JavaScript
CSS
integrity 屬性值以 shaXXX- 開頭,表示后面的哈希值使用的哈希算法,目前只允許 sha256、sha384 或 sha512 這三種哈希算法,以 sha384 比較多見。后面跟對應的哈希值即可。
值得注意的是,因為啟用 SRI 需要獲取所下載文件的內容進行計算,所以需要 CDN 服務器啟用跨域資源訪問(CORS)支持,即返回 Access-Control-Allow-Origin: * 頭。客戶端需要使用跨域的形式加載指定文件,即添加 crossorigin="anonymous" 屬性。就我所知,目前國內相對常用的免費 CDN bootcdn 已經支持 CORS,百度靜態 CDN 還不支持。
瀏覽器如何處理 SRI當瀏覽器遇到一個帶有 integrity 的 script 或 style 標簽,在執行其中的 JS 腳本或應用其中的 CSS 樣式之前,瀏覽器會首先計算所下載文件的內容的哈希值是否與 integrity 屬性給定的值相同。
如果計算結果與給定值不匹配,瀏覽器會拒絕執行腳本內容,并報出一個網絡錯誤,類似如下結果:
Failed to find a valid digest in the "integrity" attribute for resource "https://cdnjs.cloudflare.com/ajax/libs/normalize/6.0.0/normalize.min.css" with computed SHA-256 integrity "VbcxqgMGQYm3q8qZMd63uETHXXZkqs7ME1bEvAY1xK8=". The resource has been blocked.如何計算哈希值
這是 SRI 標準文檔提供的例子:
$ echo -n "alert("Hello, world.");" | openssl dgst -sha384 -binary | openssl base64 -A
使用了 OpenSSL 這個 *nix 中通常都包含的工具計算哈希值。其中 alert("Hello, world."); 是文件內容,你也可以用 cat Filename.js 直接讀取某個文件。
輸出 H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO,在此基礎上添加前綴 sha384- 就可以了。
網上也有現成的 SRI 哈希值生成器,方便好用:https://srihash.org/
CSP 與 SRI你可以使用 內容安全政策 (CSP)強制要求當前頁面所有腳本加載標簽啟用 SRI。例如
Content-Security-Policy: require-sri-for script;
強制要求所有 script 標簽啟用 SRI,瀏覽器會拒絕加載未啟用 SRI 的 script 標簽。
對應的還有 CSS 版本:
Content-Security-Policy: require-sri-for style;
你也可以同時啟用兩者。
錯誤恢復使用 CDN 時別忘了當嘗試從 CDN 加載文件失敗后加載本地版本:
")完
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/10987.html
摘要:它使用哈希值檢查確保第三方資源的完整性。只要開發者提供了被需下載資源的哈希值,瀏覽器就可以檢查實際下載的文件是否與預期的哈希值匹配。網上也有現成的哈希值生成器,方便好用與你可以使用內容安全政策強制要求當前頁面所有腳本加載標簽啟用。 出于速度和降低服務器負載考慮,有時候我們會選擇使用 CDN 加載第三方靜態資源。對于一些熱門的第三方庫,在用戶打開你的網頁之前就很有可能在瀏覽別的網站時被瀏...
摘要:它使用哈希值檢查確保第三方資源的完整性。只要開發者提供了被需下載資源的哈希值,瀏覽器就可以檢查實際下載的文件是否與預期的哈希值匹配。網上也有現成的哈希值生成器,方便好用與你可以使用內容安全政策強制要求當前頁面所有腳本加載標簽啟用。 出于速度和降低服務器負載考慮,有時候我們會選擇使用 CDN 加載第三方靜態資源。對于一些熱門的第三方庫,在用戶打開你的網頁之前就很有可能在瀏覽別的網站時被瀏...
摘要:它使用哈希值檢查確保第三方資源的完整性。只要開發者提供了被需下載資源的哈希值,瀏覽器就可以檢查實際下載的文件是否與預期的哈希值匹配。網上也有現成的哈希值生成器,方便好用與你可以使用內容安全政策強制要求當前頁面所有腳本加載標簽啟用。 出于速度和降低服務器負載考慮,有時候我們會選擇使用 CDN 加載第三方靜態資源。對于一些熱門的第三方庫,在用戶打開你的網頁之前就很有可能在瀏覽別的網站時被瀏...
摘要:與攻擊相比,攻擊往往很少見,因此對其進行防范的資源也相當稀少。不過,這種受信任的攻擊模式更加難以防范,所以被認為比更具危險性。通過實時升級系統快速同步最新漏洞,避免零日攻擊。 現在,我們絕大多數人都會在網上購物買東西。但是很多人都不清楚的是,很多電商網站會存在安全漏洞。比如烏云就通報過,國內很多家公司的網站都存在 CSRF 漏洞。如果某個網站存在這種安全漏洞的話,那么我們在購物的過程中...
閱讀 3133·2021-11-19 09:40
閱讀 2430·2021-10-14 09:42
閱讀 1698·2021-09-22 15:34
閱讀 1441·2019-08-30 15:55
閱讀 775·2019-08-29 12:59
閱讀 412·2019-08-28 18:28
閱讀 1817·2019-08-26 13:42
閱讀 1518·2019-08-26 13:29