第三方腳本與 SRI 審計
你的頁面載入的每個第三方腳本都以頁面的全部權限執行——它能讀取 DOM、監聽表單輸入、在訪客的會話中操作。本審計擷取頁面的靜態 HTML,列出它引用的每個外部腳本,標出哪些是第三方、哪些帶子資源完整性(SRI)雜湊、哪些鎖定了確切版本——並為缺少完整性的第三方腳本計算 sha384 雜湊,讓你可以直接貼進標籤。
最後更新:
擔心你站上的某個廠商腳本被改動或停機?用 myeventwatch 免費監控——到期和停機提醒,無需綁卡。
本審計檢查什麼——以及它看不到什麼
檢查器擷取頁面一次,剖析它被提供的 HTML——僅靜態 HTML。其中每個 <script src> 都會連同其主機被列出:主機與頁面可註冊網域一致時歸為第一方,不一致時歸為第三方;並檢查決定瀏覽器能否保護你的兩個屬性:integrity,即瀏覽器在執行檔案前驗證的 SRI 雜湊;以及 crossorigin,跨源 SRI 檢查要生效所必需的屬性。URL 中的版本也會被評估:以 [email protected] 或 /v2.4/ 定址的腳本是已鎖定的,而 latest 或無版本的地址是一個移動目標,其內容隨時可能在沒有人動你的網站的情況下發生變化。
請明確這條邊界,因為它很重要:v1 只剖析頁面的靜態 HTML——JavaScript 在執行時注入的腳本不在覆蓋範圍內。標籤管理器、同意工具和聊天元件經常在頁面載入後從程式碼中建立 script 元素,靜態剖析永遠看不到它們。把本審計當作你的範本和 CMS 直接引用的清單——通常是問題中最大、最可修復的部分——標籤管理器容器則在管理器自己的預覽和變更歷史中單獨審計。內聯腳本(沒有 src 的程式碼區塊)會作為一項事實計入結果,因為它們根本無法攜帶 SRI;配套指南會說明如何處理它們。
雜湊欄:算出來的,絕不猜測
對於缺少 integrity 屬性的第三方腳本,檢查器會親自擷取該腳本——透過與本站每個檢查器相同的 SSRF 防護擷取路徑,上限為前 15 個此類腳本、每個 512 KB——並計算其 SHA-384 雜湊。擷取成功時,SRI 欄會顯示完整的片段 integrity="sha384-…",可直接貼到你的標籤中,與 crossorigin="anonymous" 並列。只有腳本確實被擷取到時才顯示雜湊。如果擷取失敗、檔案過大,或腳本超出了 15 個的上限,該欄會改為顯示相應的說明——永遠不會是佔位符或猜測值——修復辦法是在你自己的建置管線中產生雜湊,那裡有確切的檔案在手。
相關檢查:安全標頭檢查為回應標頭評分——包括與 SRI 天然搭檔的 Content-Security-Policy;SSL 評分器覆蓋這些腳本到達所經過的傳輸層;配套文章第三方腳本是一種供應鏈風險剖析了一個真實事件、SRI 能阻止什麼和不能阻止什麼,以及一套可重複的審計流程。
判定應這樣讀:帶完整性且鎖定版本的第三方腳本是健康情形——瀏覽器會拒絕被替換或編輯過的檔案。沒有完整性的第三方腳本並非自動就是惡意的;它是未受保護的,意味著它的內容就是其主機今天提供的任何東西,而變更的唯一警告將是損害本身。未鎖定的地址應受到與缺失雜湊同樣的懷疑,因為 latest URL 上的 SRI 雜湊會在廠商第一次發布更新時失效——這正是這兩個發現並列報告的原因,也是持久修復永遠是一對的原因:先鎖定確切版本,再對那個確切檔案做雜湊。
本頁展示的事實
| 第三方 | 其主機可註冊網域與頁面不同的腳本——由別人提供、以你的頁面權限執行的程式碼。 |
| 完整性(SRI) | 標籤是否帶有 integrity 屬性:瀏覽器在執行檔案前核對的加密雜湊,任何不匹配都會拒絕執行。 |
| Crossorigin | 標籤是否帶有跨源 SRI 檢查所需的 crossorigin 屬性;沒有它,瀏覽器無法對該載入套用 SRI。 |
| 已鎖定 | URL 是否指名確切版本(如 [email protected]、/v2.4/),而不是內容可靜默變化的浮動 latest 或無版本地址。 |
| 計算出的 SRI | 對於缺少完整性的第三方腳本,檢查器透過實際擷取檔案計算出的 sha384 雜湊——僅在擷取成功時顯示,上限前 15 個。 |
常見問題
本審計能看到我的頁面執行的每個腳本嗎?
不能——本頁明說了:v1 只剖析頁面的靜態 HTML,因此 JavaScript 在執行時注入的腳本不在覆蓋範圍內。標籤管理器、A/B 測試工具、同意橫幅和聊天元件通常在載入後注入腳本;請在標籤管理器中或用瀏覽器的網路面板審計它們。本審計完整覆蓋的是你的已提供 HTML 直接引用的每個腳本——函式庫、CDN 元件和監控嵌入都住在那裡。
SRI 欄中的雜湊從哪裡來?
檢查器親自擷取腳本檔案並計算其 SHA-384 雜湊,對象是缺少 integrity 屬性的第三方腳本——前 15 個,每個上限 512 KB。只有腳本確實被擷取到時才顯示雜湊:如果擷取失敗、檔案過大或達到上限,該欄會改為顯示相應說明。把片段連同 crossorigin="anonymous" 一起貼到你的 script 標籤中,並在任何版本變更後重新執行審計——新版本意味著新雜湊。
我的標籤管理器腳本無法有固定雜湊。怎麼辦?
沒錯——標籤管理器容器的設計就是要變化的,所以 SRI 無法鎖定它;任何用途就是載入變化程式碼的腳本同理。對這類腳本,控制手段是另一套:限制誰能向容器發布、像審查程式碼變更一樣審查其變更歷史、只在需要的頁面載入它,並用 Content-Security-Policy 限制注入腳本能做什麼、能把資料傳到哪裡。SRI 保護固定的函式庫;治理保護動態的那些。
缺少 integrity 屬性是緊急情況嗎?
它是長期暴露,不是事件。該腳本幾乎肯定是廠商今天打算提供的檔案;問題在於,明天若有不同的檔案——在廠商被攻破、帳戶被劫持或網域過期之後——什麼都不會阻止或標記它。修復順序:先處理帶登入、付款或個人資料的頁面上的腳本,再在其他所有地方鎖定並雜湊函式庫,最後處理長尾。版本一旦鎖定,每次修復只是一行標籤改動。
為什麼鎖定欄把腳本稱為「latest」或「無版本」?
鎖定判定是對 URL 的啟發式讀取:像 @1.2.3 或 /v2.4/ 這樣像版本的片段算已鎖定,顯式的 latest 片段算浮動,URL 中任何地方都沒有版本算無版本。它被標註為啟發式,是因為只有廠商知道自己的發布方案——但安全要點不依賴這個標籤:如果那個 URL 上的位元組可以在 URL 不變的情況下變化,SRI 雜湊就無法存活,所以先鎖定,再雜湊。