擴充功能很少因為「裝了」就被標記;真正的原因是它改寫了頁面能測到的數值,讓瀏覽器自相矛盾,偵測系統才會把這種不一致當成自動化的跡象,並據此提高風險分。
會,但原因和多數人以為的不一樣。擴充功能幾乎從不因為「被安裝」而被標記。它讓你被標記,是因為它改變了頁面能測量到的內容,使你的瀏覽器不再前後一致:User-Agent 說一套,平台資訊說另一套,一個本該是原生的屬性竟然是一段 JavaScript 函式。
偵測器會把這種矛盾解讀為「有東西在竄改這個瀏覽器」,而在外部看來,竄改恰恰是自動化的典型特徵。本文依擴充功能類別逐一說明:哪些類別會引發問題、每一類破壞了哪個訊號,以及偵測器為什麼這樣打分。
核心要點
- 觸發標記的是一致性被破壞,而不是擴充功能本身。 頁面會比對本應一致的值(User-Agent 與平台、頂層視窗與 iframe、getter 與原生程式碼)。擴充功能只改其中一側,就製造出了不一致。
- 六類擴充功能造成大部分問題: 使用者代理切換器、反指紋或 Canvas 雜訊工具、重新定義
navigator屬性的擴充功能、代理/VPN 管理擴充功能、忘了關閉的自動化輔助工具,以及開發者工具。 navigator.webdriver不是擴充功能訊號。 它由自動化框架設定,一般擴充功能不會設定。把誤判怪到它頭上,只會讓你找錯方向。- 偵測器依組合打分。 單一異常訊號很少會擋下誰,但兩三個疊加就可能越過網站的門檻。
- 解決辦法是診斷: 找出是哪個擴充功能破壞了一致性,並在受影響的網站上把它關掉。
擴充功能如何變成機器人訊號
機器人偵測指令碼並不會去問你執行了哪些擴充功能。如果你想了解那套機制,瀏覽器擴充功能的隱私風險介紹了頁面如何偵測已安裝的擴充功能。本文從下一步開始:擴充功能已經在那裡,並且改動了頁面能觀察到的某些東西。
被改動的值大多來自兩個地方。一是內容指令碼改變頁面眼中的瀏覽器,例如在頁面脈絡中覆寫某個屬性,正如 Chrome 內容指令碼文件所描述的。二是擴充功能改變網路層,進而改變請求標頭或可見 IP。無論哪種方式,頁面手上都有了兩個本應吻合卻對不上的來源。
六大類別
1. 使用者代理與平台切換器
這類擴充功能會替換 User-Agent 字串,通常是為了讓網站把你當成另一種瀏覽器或裝置。字串變了,瀏覽器的其餘部分卻沒跟著變。navigator.platform、Client Hints 請求標頭、渲染引擎的行為,以及 iframe 內的 navigator 物件,仍可能回報真實的瀏覽器。
一個 Windows 上的 Chrome 字串,搭配 Linux 平台值和僅 Firefox 才有的功能集,正是偵測器要找的矛盾。具體機制見使用者代理偽裝為何適得其反和網站如何偵測使用者代理偽裝。
2. 反指紋與 Canvas 雜訊擴充功能
隨機化 Canvas 或音訊輸出的工具,本意是阻止指紋辨識。問題在於,穩定的裝置每次都會回傳相同的 Canvas 結果。如果對同一幅圖形的兩次讀取得到不同的像素,隨機性本身就是破綻。精心實作的方案能避開這一點,粗糙的則不能。權衡見 Canvas 指紋雜訊。
3. 重新定義 navigator 屬性的擴充功能
有些擴充功能透過在 JavaScript 中定義替代 getter,來覆寫 navigator.userAgent、navigator.languages 等值。原生 getter 傳給 Function.prototype.toString 時會輸出 function get userAgent() { [native code] };用 JavaScript 寫的替代函式則會輸出它自己的原始碼。
頁面還可以用 Object.getOwnPropertyDescriptor 檢查該屬性,發現 getter 位於通常不會出現的位置。這類「謊言偵測」正是 CreepJS 交叉比對可信與不可信值的方式。
4. 代理與 VPN 管理擴充功能
代理管理擴充功能會改變你的出口 IP,卻不會改變系統時區、語言清單或地區設定。IP 說在一個國家,瀏覽器說在另一個國家。這種不一致是標準的風險輸入項,而且對沒做錯任何事的人同樣會觸發。見時區與 IP 不一致和VPN 偵測為何會誤報。
5. 忘了關閉的自動化輔助工具
驗證碼求解器、巨集錄製器、表單自動填寫和使用者指令碼管理器,會以真人不會採用的方式操作頁面:瞬間填滿欄位、合成事件、點擊前沒有任何滑鼠移動。使用者指令碼管理器只是在選定頁面上執行你自己指令碼的工具,正如 Chrome userScripts API 所記載的。工具本身是中性的,但它對時序和輸入事件的影響,正是行為偵測器所測量的對象。
6. 開發者工具與裝置模擬
開啟 DevTools 和裝置模擬會改變視窗尺寸、觸控支援以及某些呼叫的時序。一個自稱手機、卻帶著滑鼠且沒有觸控點的桌面瀏覽器,看起來就是不一致的。這一項很容易無意間觸發,也很容易修復:關掉 DevTools 即可。
廣告攔截器是另一種情況,因為它干擾的是誘餌元素而不是瀏覽器屬性。它有專門的文章。
navigator.webdriver 呢?
當瀏覽器由自動化框架控制時,navigator.webdriver 為 true。一般擴充功能不會設定它。如果你被標記而 webdriver 讀數是 false,原因就是上述一致性問題之一,而不是這個旗標。反過來也成立:擴充功能清單乾乾淨淨的自動化瀏覽器,照樣會回報 true。
為什麼正常使用者也會中招
隱私和無障礙擴充功能是正當的,偵測器也清楚這一點。所以它們依組合而不是單一訊號打分。自動化檢測技術解釋了許多弱訊號如何合成一個判定,網站如何標記你的瀏覽器則從訪客的角度梳理了同一套評分過程。
倒楣的情形是疊加:使用者代理切換器加 Canvas 雜訊工具再加代理擴充功能。單獨看每一個都說得過去,合在一起卻給了頁面三個不同的理由不信任這個瀏覽器。
找出是哪個擴充功能惹的禍
你無須靠猜。我們的機器人偵測工具完全在你的瀏覽器中執行檢查,並標出哪些檢測項未通過。它不會偵測或列出你安裝的擴充功能,它偵測的是擴充功能的影響:被竄改的 navigator getter、User-Agent 與頂層視窗不一致的 iframe、被隨機化的 Canvas 輸出、平台與核心不一致、webdriver,以及 DevTools 或裝置模擬。
- 在所有擴充功能都啟用的狀態下執行檢查,記下被標記的檢測項。
- 開啟一個沒有任何擴充功能的乾淨設定檔,再執行一次。
- 對照。某一項從被標記變為通過,就指向了需要排查的類別。
- 逐一重新啟用擴充功能,直到該項再次被標記。
如果某個網站在擋你,請在該網站上停用有問題的擴充功能,而不是把它全部移除。這是一套診斷流程,不是隱藏什麼的方法:如果擴充功能改變了瀏覽器回報的內容,讓它重新前後一致才是誠實的結果。
常見問題
僅僅安裝擴充功能就會被標記嗎?
不會。「存在」不是訊號。標記來自擴充功能引入的可測量的不一致,或是瞬間填表之類的行為。
隱私擴充功能會讓我更像機器人嗎?
可能會。覆寫數值或隨機化輸出,會製造出一般瀏覽器沒有的不一致,而稀有的設定本身也更容易被辨識。
擴充功能會設定 navigator.webdriver 嗎?
不會。它由自動化框架設定,一般擴充功能會讓它保持 false。
我怎麼知道哪個擴充功能有問題?
在開啟擴充功能和乾淨設定檔兩種狀態下執行同一項檢查,然後逐一重新啟用擴充功能,同時觀察哪一項發生變化。


