子資源完整性 (SRI) 實現
子資源完整性 (SRI) 使瀏覽器能夠驗證它們獲取的資源(例如,來自 CDN 的資源)在傳遞過程中沒有被意外篡改。它的工作原理是允許您提供一個加密雜湊值,獲取的資源必須與此雜湊值匹配。
問題
如果攻擊者利用了內容分發網路 (CDN) 並修改了託管在該 CDN 上的 JavaScript 庫的內容,那麼使用這些庫的所有網站都會產生漏洞。
例如,託管在 library.org 上並從 example.org 載入的 JavaScript 可以訪問 example.org 的全部內容。如果攻擊者修改了託管的 JavaScript 以包含惡意程式碼,則可能導致下載連結被篡改、網站被破壞、憑據被竊取、拒絕服務 (DoS) 攻擊等。
解決方案
使用 SRI 將外部 JavaScript 資源鎖定在其特定時間點的已知內容。這透過 base64 編碼的加密雜湊值進行驗證。在載入資源時,在 integrity 屬性中指定此雜湊值。
如果檔案在此之後被修改,雜湊值將不匹配,支援的瀏覽器將拒絕載入它。
載入外部 JavaScript 或樣式表資源時應使用 SRI。這些資源應透過 HTTPS 載入。
請注意,CDN 必須透過設定 Access-Control-Allow-Origin 標頭來使用 跨域資源共享 (CORS)。
示例
從 CDN 載入 jQuery 2.1.4
html
<script
src="https://code.jquery.com/jquery-2.1.4.min.js"
crossorigin="anonymous"></script>
從 CDN 載入 AngularJS 1.4.8
html
<script
src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"
crossorigin="anonymous"></script>
自行生成雜湊
bash
$ curl -s https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js | \
openssl dgst -sha384 -binary | \
openssl base64 -A
r1y8TJcloKTvouxnYsi4PJAx+nHNr90ibsEn3zznzDzWBN9X3o3kbHLSgcIPtzAp