流量分析、廣告、線上客服、付款元件、從 CDN 載入的函式庫。許多網站在每次顯示頁面時都會載入不是自己撰寫的指令碼,而這些指令碼以與網站自身程式碼相同的權限執行。本文依據 OWASP 與 MDN 的第一手資料,說明如何掌握正在執行的外部指令碼、限制它們能做的事,並及早發現變化(不介紹攻擊方法)。
為什麼第三方指令碼是風險
OWASP 的《Third Party JavaScript Management Cheat Sheet》把嵌入第三方 JavaScript 的風險分為三類。
- 失去對變更的控制
- 通常無法保證提供者的程式碼與開發、測試時保持一致。提供者隨時可以推出新功能
- 在使用者裝置上執行任意程式碼
- 第三方程式碼在加入前很少被審查,並以與使用者相同的權限執行。OWASP 也舉了提供者網域到期後被他人重新註冊、放上惡意程式碼的例子
- 向第三方揭露資訊
- 載入指令碼時,瀏覽器直接連線到提供者的伺服器,IP 位址以及提供者先前設定的 Cookie 等也會送到提供者
使用標籤管理工具時情況更複雜。OWASP 說明,標籤管理工具回傳的內容可以在其管理介面修改並立即生效,下一次顯示頁面就會執行修改後的程式碼。因此,只看網站的原始碼無法得知實際執行的全部程式碼。
本站也報導過這類事件:Polymarket 第三方指令碼事件。問題出在使用者正在看的頁面中執行的程式碼。
自己網站的頁面(顯示內容、表單輸入、Cookie)
↓ 在同一頁面中執行
自己的指令碼
可以自己審查與提供
第三方指令碼
提供者可以修改內容,能讀取頁面
向外部送出的表單
輸入會送到其他來源
↓ 限制手段
盤點與移除
SRI / 自行託管 / CSP script-src、connect-src
CSP form-action
防禦方法:6 個步驟
列出所有正在執行的第三方指令碼
第一步是建立清單。包括直接寫在 HTML 中的指令碼、在標籤管理工具中設定的標籤,以及函式庫或外掛自行載入的內容。
逐項記錄:從哪個來源載入、屬於誰的服務、為什麼加入、在哪些頁面執行、出問題時由誰用什麼方式停用。iframe、圖片等會連線到外部伺服器的資源也一併列出,這份清單之後可以直接用於 CSP 設定。
移除不用的,在重要頁面上進一步精簡
清單中「用途不明」「沒有負責人」的項目就是移除候選。過去活動用的標籤、已經換掉的分析服務常常還留著。
登入、付款、變更密碼或電子郵件、管理後台等輸入價值高的頁面,只保留必要的指令碼。放進全站共用範本的標籤也會出現在這些頁面,所以請依頁面類型決定是否載入。對於不需要接觸頁面內容的元件,OWASP 介紹了放進其他網域的 iframe(加上 sandbox 屬性)與頁面隔離的方法。
限制標籤管理工具的發布權限
OWASP 提醒,資料層(彙整傳給標籤之值的物件)不是隔離機制,標籤管理工具的容器可以執行自訂 JavaScript 與 HTML 標籤。並建議限制發布權限,像對待應用程式程式碼一樣審查變更。
具體可從四件事開始:只讓少數人能發布,為管理介面的帳號啟用雙重驗證,不需要時停用自訂 HTML 標籤,發布前由另一個人確認。
為內容固定的檔案加上 SRI,或從自己的網站提供
SRI(子資源完整性)是在 <script> 等元素的 integrity 屬性寫入檔案雜湊,瀏覽器收到的檔案不一致時拒絕載入的機制。根據 MDN,可用的雜湊是 sha256、sha384、sha512;跨來源載入時提供者需要允許 CORS,並加上 crossorigin 屬性。
SRI 只適用於有版本號的函式庫這類內容不變的檔案。用在提供者隨時更新的分析標籤上,每次更新都會無法載入。這種情況下,可以從自己的網站提供審查過的版本(OWASP 所說的 in-house mirroring),或在重要頁面上不載入。函式庫的已知漏洞,可以把 lockfile 貼到相依套件漏洞掃描器檢查。
用 CSP 限制載入來源與傳送目標
在 CSP(Content-Security-Policy)中,依第 1 步的清單寫入允許的來源。script-src 限制指令碼的載入來源,connect-src 限制 fetch、XMLHttpRequest、WebSocket、EventSource、sendBeacon 等的連線目標(MDN)。
限制表單送出目標的 form-action 不會退回使用 default-src。MDN 說明不設定就允許任何目標。如果表單只送到自己的網站,請明確寫上 form-action 'self'。
直接強制執行可能讓正常功能停止,所以先用 Content-Security-Policy-Report-Only 只收集違規報告。MDN 指出,要接收報告需要指定 report-to,而且這個標頭不能在 <meta> 元素中使用(已棄用的 report-uri 也仍可傳送報告)。可以用 CSP 建構器試著組合。標頭整體的思路請見安全標頭的選擇方式。
讓變化可被發現,並事先決定停用步驟
第三方指令碼即使你什麼都不做也會改變。依固定間隔(例如每月一次)把清單與實際狀態比對;CSP 違規報告中出現陌生的目標時加以調查;訂閱提供者的安全通知。
把出問題時由誰、在哪個畫面停用哪個標籤寫成文件。有信用卡付款頁面的業者,也請確認 PCI DSS v4.0.1 中關於付款頁面安全的要求 6.4.3 與 11.6.1 已於 2025 年 3 月 31 日起生效(PCI SSC)。對於把帳戶資料處理全部外包給合規第三方、使用 SAQ A 的商家,這兩項要求改為一項資格條件:確認自己的網站不易受到可能影響電子商務系統的指令碼攻擊(標準本身的要求不變)。
四種措施能防什麼、不能防什麼
| 措施 | 能防止 | 不能防止 | 適用對象 |
|---|---|---|---|
| 移除 | 與該指令碼有關的所有風險 | ― | 用途不明或不再使用的指令碼 |
| SRI | 傳輸途中或提供者端的檔案替換 | 未被竄改的指令碼在正常功能中傳送的資訊。提供者更新後無法載入 | 有版本號的固定檔案 |
| 自行託管 | 提供者端的替換 | 不自己更新就會留下舊版本 | 審查後持續使用的函式庫 |
| CSP | 從未允許的來源載入、向未允許的目標連線或送出表單 | 已允許的來源本身遭入侵。傳送到已允許目標的資訊 | 所有頁面(分階段導入) |
容易擴散的狀態
- 把標籤放在全站共用範本中
- 很多人擁有標籤管理工具的發布權限
- 沒有 CSP,或沒有寫
form-action - 沒有第三方指令碼清單,也沒決定停用方式
已經收斂的狀態
- 依頁面類型區分載入的標籤
- 能發布的人有限,變更由另一人確認
- 用 CSP 固定載入來源、連線目標與表單送出目標
- 有清單,並定期與實際狀態比對
用網站透明度檢查器確認結果
建立清單後,與實際狀態比對。把你管理的網站首頁 URL 輸入網站透明度檢查器,它會從取得的 HTML 中找出以下項目。
- 外部指令碼 / 資源的來源
- script、iframe、img、link(stylesheet、preload 等)參照的其他來源。不在第 1 步清單中的,要查明用途
- 解析 / 廣告標籤(追蹤)
- 以名稱顯示常見的分析、廣告、監控服務。名稱只是參照目標的分類,不是安全判定
- 未知的第三方指令碼(可能讀取輸入)
- 從其他來源載入的指令碼。不會因為提供者知名就判定安全
- 向外部提交的表單
- form 的 action 或 button 的 formaction 指向其他來源。若非刻意設定,應最優先確認,並用 CSP 的 form-action 固定
- 設定了 Cookie
- 取得的回應中是否有 Set-Cookie。不檢查由 JavaScript 設定的 Cookie
這個工具有其限制。它只取得首頁(包括各語言首頁與 index.html),不執行指令碼,也不額外取得嵌入的檔案。標籤管理工具之後載入的指令碼、只在按下按鈕時才發生的請求都看不到。因此也要同時做以下確認。
- 開啟要檢查的頁面(包括登入與付款頁面),開啟瀏覽器的開發人員工具
- 在 Network 分頁中記錄,用測試資料實際輸入與操作
- 查看是否有送往清單以外外部網域的請求
- 設定 CSP 後,用安全標頭偵測確認標頭確實有回傳
在日本經營網站時:外部傳送規範
根據日本總務省的說明,2022 年 6 月修正的《電氣通信事業法》訂立了規範:透過標籤或資訊蒐集模組把使用者資訊傳送到外部時,要讓使用者能夠確認(2023 年 6 月 16 日施行)。適用對象是經營電氣通信事業者;總務省把訊息傳遞服務、社群網路、搜尋服務,以及新聞網站、彙整網站等資訊提供服務列為主要對象,同時說明自家商品的網路銷售、企業官網與個人部落格不屬於電氣通信事業,不在適用範圍內。
適用時,需要把傳送的資訊內容、處理該資訊者的姓名或名稱、使用目的通知使用者,或置於使用者容易得知的狀態等。第 1 步的清單也可以用來撰寫這些公開內容。是否適用,請參照總務省的說明與流程圖確認。
本站觀點:不看知名度,看它在該頁面能讀取什麼
檢查第三方指令碼時,常會得出「是大公司的服務所以沒問題」的結論。但 OWASP 列為最大的風險,正是提供者的伺服器遭入侵。越知名的服務,被越多網站使用,遭入侵時影響也越廣。
所以本站的網站透明度檢查器不會因為提供者知名就顯示為安全。判斷標準有三點:指令碼在哪些頁面執行、在那裡能讀取什麼、出問題時幾分鐘內能停用。
資料來源(第一手資料)
- OWASP《Third Party JavaScript Management Cheat Sheet》— cheatsheetseries.owasp.org(三類風險、標籤管理工具、SRI、iframe 隔離、in-house mirroring)
- MDN《Subresource Integrity》— developer.mozilla.org(integrity 屬性、可用雜湊、CORS 與 crossorigin 屬性)
- MDN《Content Security Policy (CSP)》— developer.mozilla.org(script-src、report-only 試行)
- MDN《CSP: form-action》— developer.mozilla.org(沒有 default-src 退回機制)
- MDN《CSP: connect-src》— developer.mozilla.org(涵蓋的 API)
- MDN《Content-Security-Policy-Report-Only》— developer.mozilla.org(需要 report-to,不能用於 meta 元素)
- PCI SSC《Important Updates Announced for Merchants Validating to Self-Assessment Questionnaire A》(2025 年 1 月 30 日)— blog.pcisecuritystandards.org(要求 6.4.3、11.6.1 自 2025 年 3 月 31 日起生效)
- 日本總務省《外部送信規律》(日文)— soumu.go.jp(宗旨、對象、公開事項)
接著讀
- 工具:網站透明度檢查器/CSP 建構器/安全標頭偵測
- 設定:安全標頭的選擇方式
- 事件:Polymarket 第三方指令碼事件
- 用語:什麼是 XSS/什麼是 PCI DSS