瀏覽器擴充功能往往能讀取你造訪的所有網頁資料,甚至在頁面中注入指令碼。了解擴充的權限風險、如何評估其安全性,以及減少隱私洩漏、保護瀏覽資料的方法。
是的,如果你授予了足夠寬泛的權限,瀏覽器擴展幾乎可以讀取並修改你在網路上的一切操作。一個擁有「存取你在所有網站上的全部資料」權限的擴展,可以看到你造訪的頁面、你在表單中輸入的文字、你的 Cookie,以及你的瀏覽歷史。絕大多數擴展是誠實的,但真正關鍵的是權限模型:最安全的做法是只安裝少量擴展、授予盡可能窄的存取權限,並定期進行稽核。
擴展究竟能做什麼
當你安裝一個擴展時,你授予了它在資訊清單(manifest)中宣告的一組權限。這些權限決定了擴展能看到和修改你瀏覽行為的程度。許多人會在沒看清提示的情況下直接點擊「新增至瀏覽器」,所以有必要先弄清這些權限類別到底意味著什麼。
一個擁有寬泛主機權限的擴展,通常可以:
- 讀取頁面內容——你開啟的每個頁面的完整文字、連結和結構
- 讀取並填寫表單欄位——包括搜尋框、登入表單和付款欄位
- 存取 Cookie——其中可能包含讓你保持登入狀態的工作階段權杖
- 讀取你的瀏覽歷史——你造訪過的網站和網址清單
- 注入指令碼——在其他網站內部執行它自己的 JavaScript
- 發起網路請求——把它收集到的資料傳送到遠端伺服器
關鍵在於:擴展是帶著你的活動工作階段,執行在你的瀏覽器內部的。它不是一個受同源政策約束的遠端網站,而是一個被信任的「內部人員」。這正是為什麼一個微小的權限失誤,可能帶來巨大的隱私影響。這種資訊清單層級的權限授予,與網站自身可查詢的頁面層級 navigator.permissions.query() API 是完全不同、寬泛得多的概念——參見 Permissions API 指紋了解那個獨立、更窄的機制如何運作。
用通俗語言理解權限模型
現代瀏覽器(Chrome 的 Manifest V3、Firefox 的 WebExtensions)透過一個資訊清單檔案來描述擴展的影響範圍。下面是一個簡化的範例,展示你在安裝時其實是在核准的權限部分:
{
"name": "範例擴展",
"permissions": ["cookies", "tabs", "storage"],
"host_permissions": ["<all_urls>"],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
]
}
其中 <all_urls> 這個值最值得警惕。它意味著擴展可以在你造訪的每一個網站上執行它的內容指令碼、讀取這些頁面並對其進行操作。相較之下,限定在單一網域上的擴展只能觸及那一個網站。
主機權限與 <all_urls>
主機權限定義了擴展可以在哪些網站上執行。像 https://*.example.com/* 這樣的模式將其限制在一個服務內;而 <all_urls> 或 *://*/* 則授予了對整個網路的存取權限。寬泛的主機權限,是決定一個擴展隱私影響範圍的最大單一因素。
activeTab 與點擊時存取
activeTab 權限要安全得多:它僅在你點擊擴展圖示時授予對目前分頁的暫時存取權限,而當你離開該頁面後,權限即被收回。基於 activeTab 建構的擴展無法在背景悄悄地監視你。如果瀏覽器提供這一選項,把網站存取設為「點擊時執行」,就能把寬泛的擴展變成隨選執行的擴展。
內容指令碼
內容指令碼是擴展注入到你所造訪頁面中的程式碼。它可以讀取 DOM、觀察你輸入的內容,並改寫頁面。內容指令碼既是正當功能(價格比較、文法檢查)的實作機制,也是濫用式資料收集的手段。它的 matches 模式的涵蓋範圍,決定了它能看到你多大比例的瀏覽行為。
好擴展也會「變壞」
風險並不僅來自一開始就心懷惡意的擴展。還有幾條不那麼明顯的路徑,會通向同樣的結果。
- **被棄用的擴展。**開發者停止維護某個擴展,程式碼仍然能用,但安全漏洞無人修補,這個擴展就變成了一個帶著寬泛權限、陳舊失修的入口。
- **被收購後用於牟利的擴展。**一個廣受信任的熱門擴展被賣給新所有者,對方悄悄推送一次更新,注入廣告、聯盟連結或追蹤程式碼。你的瀏覽器會自動更新它,而你多年前授予的權限依然有效。
- **供應鏈遭攻擊。**某個擴展正當地打包了第三方函式庫或依賴遠端設定;一旦該依賴或伺服器遭攻陷,惡意酬載就會送達所有安裝了該擴展的使用者。
真正危險的時刻,往往不是安裝那天,而是幾個月後那次悄無聲息的自動更新——它依託的,正是你早已核准並遺忘的權限。
這就是為什麼「我安裝時它還是好好的」並不能作為保證。寬泛的權限是一種長期存在的隱患,可能在未來任何一次更新中被啟動。
擴展與指紋辨識
除了直接讀取你的資料之外,擴展還會讓你更容易被跨站追蹤——此外,它也可能讓你更容易被標記為自動化程式。你所安裝的那一組特定擴展,以及它們對頁面所做的改動,都可能成為你瀏覽器指紋的一部分。
頁面如何偵測你安裝了哪些擴展
頁面無法直接向瀏覽器索取一份「你裝了哪些擴展」的清單。看起來最接近的 API 是 navigator.plugins,但在現代瀏覽器裡,這份列表只描述瀏覽器自身內建的 PDF 處理能力,永遠不會包含你安裝的擴展。偵測擴展靠的是另一條路:搜尋擴展在頁面上留下的副作用。
- **資源探測。**許多擴展會打包一些檔案——圖示、注入的樣式表、內容指令碼包——並將其暴露給網頁,以便自己的指令碼能夠載入它們。擴展會把這些檔案宣告為網頁可存取資源,位於類似
chrome-extension://<extension-id>/<file>這樣的網址上。一段追蹤指令碼只要知道某個熱門擴展的 ID 和檔名,就能請求這個網址並檢查它是否能載入成功:載入成功代表該擴展已安裝,失敗則代表未安裝。對一批已知的擴展 ID 逐一這樣檢測,就能拼出你已安裝擴展集合的「是/否」指紋。正是這種探測手法,促使 Manifest V3 收緊了web_accessible_resources:一項資源如今只對matches模式中列出的來源開放,擴展還可以選擇啟用use_dynamic_url,用一個由 Chrome 在每次工作階段(瀏覽器重新啟動或擴展重新載入)時重新產生的 ID,取代它固定不變的那一個。Firefox 則是預設就這麼做:它給每個瀏覽器實例分配一個隨機的moz-extension://UUID,而不是擴展的真實 ID,目的正是不讓網站藉此辨識出你裝了哪些擴展。不過這兩道防線都不追溯既往:沒有啟用動態網址的擴展,依然會在它公開且固定的 ID 上作出回應——這也是這套探測手法至今仍然奏效的原因。 - **行為側通道。**即便一個擴展沒有任何可以直接探測的資源,它仍然會作用於頁面。一段會注入元素、加入 CSS 類別或移除符合過濾規則之節點的內容指令碼,會留下頁面可以觀察到的結構性痕跡——廣告攔截器刪除的元素、密碼管理員注入的按鈕、文法檢查工具標記出的文字欄位。時機本身也是一種訊號:在
document_start階段執行的指令碼會先於頁面自身程式碼執行,在document_idle階段執行的指令碼則在其後執行,擴展生命週期中的這兩個時間點都能從頁面一側測量出來。廣告攔截器是最典型的例子:網頁無法直接詢問使用者是否安裝了廣告攔截器,只能設置一個誘餌元素或監視某個請求是否被攔截,再據此推斷結果——參見廣告攔截器偵測的真實原理,了解背後的三種偵測方式,以及偵測結果能揭示什麼、又揭示不了什麼。
稀有的擴展組合會讓你更容易被辨識
這正好呼應上文提到的指紋悖論:一個小眾的隱私擴展,可能讓你的瀏覽器變得更容易辨識,而非更難,因為很少有其他使用者擁有完全相同的設定。被偵測到的擴展和其他任何指紋訊號一樣——參見我們關於指紋熵與匿名集的文章,了解真正縮小你所融入之人群規模的是稀有程度本身,而不是使用某個工具這件事。EFF 的 Cover Your Tracks 衡量的正是你整個瀏覽器的這種唯一性權衡,而三四個被偵測出來、組合起來又不常見的擴展,其影響方式和一個罕見的字型或 GPU 字串是一樣的。
擴展會讓你被誤判為機器人嗎?
擴展偵測還服務於另一套評分體系:機器人偵測。自動化框架有時會在一個原本普通的瀏覽器設定之上,附帶執行一些圖方便的擴展——代理管理工具、驗證碼自動求解擴展、忘了關掉的開發者工具。偵測到其中任何一個,尤其是再疊加 navigator.webdriver 被設為 true,都會計入與無頭瀏覽器和指令碼化流量相同的風險評分;參見機器人偵測技術了解這類訊號是如何組合成一個判定結果的。這也可能反過來影響真實使用者——一個日常真實使用的開發者或無障礙輔助擴展,偶爾也會把一次原本正常的瀏覽工作階段推過網站的自動化判定門檻,這也是即便不考慮隱私追蹤、擴展衛生同樣重要的另一個原因。依擴展類別逐一拆解哪些擴展破壞了哪些訊號,請參閱瀏覽器擴展會讓你被判定為機器人嗎。
想了解你整體的指紋狀況,可閱讀我們的瀏覽器指紋完全指南;想比較不同的強化方案,可參閱我們的隱私工具比較。
安裝前如何評估一個擴展
對待每個擴展,都應像授予某個應用程式存取你帳戶的權限一樣謹慎,因為從功能上看,你做的事情與此非常接近。請逐項核對下面這份清單。
| 訊號 | 風險較低 | 風險較高 |
|---|---|---|
| 權限範圍 | activeTab、單一主機模式 | <all_urls>、寬泛主機權限 |
| 發布者 | 知名公司或老牌開發者 | 匿名或全新帳戶 |
| 使用者量與評價 | 安裝量大、評價穩定 | 使用者極少,或評價突然激增 |
| 最後更新時間 | 近期且定期更新 | 多年未動(已棄用) |
| 原始碼 | 開源、可稽核 | 閉源、混淆、僅有壓縮程式碼 |
| 資料處理方式 | 清晰、最小化的隱私說明 | 隱私政策含糊或乾脆沒有 |
沒有任何單一訊號能下定論,但它們的組合會講出一個故事。一個限定為 activeTab、由活躍開發者維護的開源擴展,與一個閉源、<all_urls>、三年前最後一次更新的擴展,是截然不同的兩回事。
你也可以檢查自己瀏覽器中目前正在執行的擴展。BrowserInsight 的外掛與擴展偵測工具能幫你查看可被偵測到的擴展,並理解它們的影響範圍;而指紋偵測工具則會展示你的整體設定如何影響可追蹤性。
降低風險的實用步驟
你不必徹底放棄擴展——你需要的是有意識地去管理它們。
1. 遵循最小權限原則
優先選擇請求權限最窄的擴展。如果兩個擴展能完成同樣的工作,就選限定為 activeTab 或特定主機的那個,而不是要求存取所有網站的那個。
2. 使用「點擊時」存取
對於支援該選項的擴展,把網站存取設為「點擊時執行」,讓它們只在你主動呼叫時才執行。這能在不損失功能的前提下,消除大部分背景資料收集。
3. 定期稽核
每年一到兩次,開啟瀏覽器的擴展管理頁面,刪除所有你已不再使用的擴展。每個已安裝的擴展都是攻擊面;一個用不上的擴展,就是純粹的負擔。
4. 留意更新與所有權變更
如果一個原本簡單的擴展突然開始請求新的、更寬泛的權限,要保持警惕——瀏覽器通常會提示你。權限的突然擴張,可能意味著所有權或意圖發生了變化。
5. 在適當場景下使用企業政策
在受管理的環境中,管理員可以透過瀏覽器政策將經過核准的擴展加入白名單,並封鎖其餘所有擴展。這是大規模場景下最可靠的控制手段,徹底免去了逐個使用者自行判斷的環節。
6. 有原生功能可用時,優先選擇原生功能而非擴充功能
Firefox 的 Multi-Account Containers 過去是在同一個瀏覽器裡把不同身分分開的唯一辦法——如今它正逐漸收編成一項原生、不需要擴充功能的內建能力。當瀏覽器本身就內建了對等的功能,使用它就代表你少信任一個要求寬泛主機權限的外掛。至於這種隔離具體涵蓋了什麼、又沒涵蓋什麼,可參閱容器分頁與追蹤一文——它劃出的是一道儲存空間的邊界,而不是用來取代你對目前仍在使用的擴充功能所做的稽核。
常見問題
瀏覽器擴展能讀取我的密碼嗎?
如果一個擴展有權在你登入的網站上執行,並有權讀取表單欄位,那麼它在技術上就能在密碼被提交之前,觀察到你輸入的內容,包括密碼。這正是為什麼向不受信任的擴展授予寬泛主機權限非常危險。對於執行在頁面上的內容指令碼而言,密碼欄位並不會自動成為禁區。
來自官方商店的擴展一定安全嗎?
不一定。官方商店會進行自動化審核和部分人工審核,能過濾掉大量純粹的惡意軟體,但審核並不完美。被棄用的擴展、所有權轉移,以及引入追蹤的更新,都可能矇混過關。出現在商店裡能降低風險,但無法消除風險。
隱私擴展會讓我更難被追蹤嗎?
有時是,有時恰恰相反。內容攔截器可以阻止許多追蹤器,但你所執行的那一組與眾不同的擴展,以及它們對頁面所做的改動,反而可能增加你的指紋特徵。請盡量選擇被廣泛使用、維護良好的工具,而非小眾冷僻的工具,並透過指紋偵測來驗證最終的淨效果。
裝多少擴展算太多?
並沒有一個固定的數字,但每個擴展都會增加權限、攻擊面和潛在的指紋訊號。一個不錯的原則是:只保留你正在積極使用的擴展,優先選擇窄權限,其餘一律刪除。少而精的擴展,勝過一長串被遺忘的擴展。


