探索網站如何檢測自動化工具和爬蟲程式,了解 WebDriver 檢測、行為分析等技術的實現原理。
網站識別機器人和爬蟲的方式,是把許多單獨並不可靠的弱訊號組合成一個可信的判斷:自動化標誌(如 navigator.webdriver)、無頭瀏覽器洩漏、行為模式(例如不像人類的滑鼠軌跡和操作節奏)、瀏覽器指紋的不一致性、網路層的 TLS/HTTP-2 簽章、IP 信譽,以及驗證碼等互動式挑戰。任何單一檢測都不足以下定論,因此現代檢測系統會同時對數十個特徵進行評分。本文將解釋主要技術的運作原理,以及每種技術在什麼情況下會失效。
為什麼自動化檢測很重要
自動化流量本身並不一定是壞事。搜尋引擎爬蟲、可用性監控和無障礙工具都屬於機器人,而大多數網站是歡迎它們的。真正的問題在於惡意自動化:撞庫攻擊、搶購囤貨、繞過付費牆的內容擷取、廣告詐騙以及大量註冊假帳號。自動化檢測的目的,就是把正常使用者和友善機器人,與濫用型自動化區分開來,並且盡量不用頻繁的驗證碼去打擾真實使用者。
由於攻擊者會不斷改進工具,讓它看起來更像人,檢測因此成了一場「貓捉老鼠的遊戲」。防禦方很少依賴單一手段,而是把用戶端訊號、行為分析和伺服器端網路情報層層疊加,這樣攻破其中一層並不足以矇混過關。
自動化標誌:navigator.webdriver 及其同類
成本最低的訊號,是瀏覽器自己「招供」。當瀏覽器由 WebDriver 協定(Selenium 等傳統自動化方案)驅動時,標準屬性 navigator.webdriver 會被設為 true。許多簡陋的指令稿忘記隱藏它,因此它仍然是一個有用的初篩訊號。
除了這個屬性之外,自動化框架往往會在全域作用域中留下痕跡:注入的物件、window 上異常的屬性,或驅動程式特有的變數。檢測指令稿會主動探測這些已知特徵。
// 用戶端對常見自動化訊號的最簡檢測。
function detectAutomationSignals() {
const signals = {
webdriver: navigator.webdriver === true,
// 無頭 Chrome 早期會回報零個外掛程式。
noPlugins: navigator.plugins.length === 0,
// 真實瀏覽器會暴露 languages 陣列;部分機器人卻為空。
noLanguages: !navigator.languages || navigator.languages.length === 0,
// 洩漏到頁面中的已知自動化痕跡。
cdpArtifacts: '__nightmare' in window || '_phantom' in window,
};
signals.suspicious = Object.values(signals).some(Boolean);
return signals;
}
這些檢測都很容易被偽造。有經驗的操作者可以修補
navigator.webdriver並注入偽造的外掛程式,因此自動化標誌最好只作為眾多輸入之一,絕不能單獨作為證據。
無頭瀏覽器檢測
無頭 Chrome 及類似執行環境支撐著相當大一部分擷取和自動化工作。早期它們很容易被識別,因為 User-Agent 字串裡會直接含有 HeadlessChrome。如今這個破綻基本消失了,於是檢測轉向了更隱蔽的不一致之處。
缺失或不一致的屬性
無頭環境算繪頁面的方式往往與正常的桌面瀏覽器不同。常見的破綻包括:空的或異常的外掛程式清單、缺失的媒體編解碼器、回傳相互矛盾狀態的 permissions API(例如同時把通知回報為 denied 和 prompt),以及指向 SwiftShader 等軟體光柵化器、而非真實 GPU 硬體的 WebGL 算繪器字串。
算繪與功能異常
執行在真實硬體上的真實瀏覽器,會在 Canvas、WebGL 和音訊 API 上給出一致的結果。無頭或虛擬化的環境則經常出現矛盾——比如在 User-Agent 中自稱高階 GPU,WebGL 卻回報通用的軟體算繪。這類矛盾是很強的機器人訊號。我們關於Canvas 指紋如何識別你的裝置和WebGL 指紋技術細節的深入文章,解釋了這些相同的算繪訊號在底層是如何運作的。
想深入了解 Selenium、Puppeteer、Playwright 各自洩露的具體訊號——包括 CDP 全域變數、SwiftShader GPU 特徵及隱身外掛的限制——請參閱無頭瀏覽器偵測:Selenium 與 Playwright 如何被識破。控制協定本身還有更底層的一面:我們關於偵測 Chrome DevTools Protocol(CDP)自動化的文章說明了 Runtime.enable 的主控台序列化副作用,它能獨立於任何框架特有痕跡,揭露已連線的 Puppeteer 或 Playwright 用戶端。
行為分析
當一個工作階段通過了靜態檢測後,防禦方會繼續觀察它「如何」行動。人類的操作充滿雜訊、不夠精確;指令稿則乾淨而確定。行為分析正是把這種差異轉化為分數。
- 滑鼠移動——真實的游標沿著帶抖動的曲線移動,速度時快時慢。機器人往往走直線,或直接「瞬移」到目標。
- 時序與節奏——人類會停頓、猶豫,打字節奏也會變化。完全均勻的按鍵間隔,或 100 毫秒以內就完成的表單提交,都顯得像自動化。
- 互動熵——真實工作階段包含捲動、停頓和誤點擊。一個徑直奔向目標、毫無多餘動作的工作階段就很可疑。
- 導覽模式——爬蟲傾向於按廣度優先或字母順序請求頁面,並忽略人類自然會觸發的 JavaScript 算繪內容。
行為分析之所以強大,正是因為它在大規模場景下很難令人信服地偽造;但它需要足夠的互動資料才能生效,並且可能對使用輔助技術或習慣特殊的使用者產生誤判。
同樣的滑鼠移動與按鍵遙測資料,也出現在網路產業的另一端——只是這次針對的是真人而非機器人:工作階段回放腳本(如 FullStory、Hotjar)會記錄完全相同的訊號,為使用者體驗研究重建真實訪客工作階段的視覺回放。
用於識別機器人的指紋訊號
瀏覽器指紋——我們在瀏覽器指紋完全指南中有深入介紹——同樣是一種機器人檢測工具。這裡的目標不是跨站追蹤某個使用者,而是發現內部的不一致性和叢集。
不一致的指紋(Windows 的 User-Agent 卻回報 macOS 的字型堆疊,或行動端 User-Agent 配桌面端螢幕解析度)暗示著偽造。叢集則是另一半線索:當成千上萬個「各不相同」的訪客共享同一個罕見且完全一致的指紋時,它們幾乎可以肯定是同一套自動化工具用同一範本大量產生的。
網路層指紋
有些最強的訊號完全不經過 JavaScript。它們存在於用戶端協商連線的方式中,因此從瀏覽器沙箱內部很難偽造。
| 層級 | 技術 | 揭示的資訊 |
|---|---|---|
| TLS | JA3 / JA4 簽章 | 交握中加密套件和擴充功能的順序與組合;可識別底層 TLS 函式庫 |
| HTTP/2 | 訊框與標頭指紋 | 串流優先順序、標頭順序及設定訊框,真實瀏覽器與 HTTP 用戶端在此存在差異 |
| HTTP 標頭 | 標頭順序與大小寫 | 自動化函式庫發出的標頭,其順序或大小寫與 Chrome、Firefox 不同 |
| IP | 信譽與 ASN | 資料中心網段、已知代理池及濫用歷史,與住宅位址形成對比 |
如果一個請求的 User-Agent 自稱是 Chrome,其 TLS 交握卻與 Python requests 或 Go net/http 用戶端相符,這就是一個刺眼的矛盾。JA3 式指紋正是專門捕捉這類「只精修了 JavaScript 層、卻忽略網路層」的自動化。
IP 信譽與速率限制
IP 情報是最古老的防線,至今仍是最有效的手段之一。來自資料中心 ASN(雲端服務商、主機代管公司)的流量,在統計上遠比來自住宅 ISP 的流量更可能是自動化,因此會受到額外審查。已知的代理與 VPN 出口節點、Tor 中繼,以及有過濫用歷史的位址,都會抬高風險分值。
速率限制是對信譽的補充:即便是一個乾淨的住宅 IP,如果每分鐘請求上百個頁面,也會變得可疑。把存取速度與信譽結合起來,防禦方就能在不打擾正常瀏覽的前提下,限制明顯的擷取行為。這也是為什麼進階濫用會轉向住宅代理網路——為的就是借用真實家庭網路的信譽。
驗證碼與挑戰系統
當被動訊號模稜兩可時,網站會升級到主動挑戰。傳統的圖片驗證碼要求使用者直接證明自己是人,而現代系統(隱形挑戰、工作量證明謎題和代管式挑戰頁面)則盡量在背景分析同樣的行為與指紋訊號,以最小的使用者摩擦來驗證合法性。
挑戰是最後的手段,而非第一道防線,因為它會損害真實使用者的體驗,而且可以被人工解碼服務大規模破解。最好的檢測體系會謹慎使用挑戰,僅在綜合風險分超過閾值時才觸發。
一種新興的替代方案徹底繞開了驗證碼和指紋評分:密碼學證明。匿名憑證能讓用戶端證明自己是合法真人——或者透過 Cloudflare 的 Web Bot Auth,證明自己是經過驗證的機器人營運方——而不需要網站為了得出這個結論就建立可追蹤的畫像。這目前仍是一個新興、大多停留在提案階段的方向,尚未被普遍部署,但它指出了部分評分邏輯未來可能演進的方向。
行動應用其實已經擁有比瀏覽器強得多的密碼學手段:裝置認證。它不靠對數十種弱訊號評分,而是由硬體信任根直接簽發一枚權杖,證明裝置和應用程式確實未被竄改——這也是為什麼詐騙風險高的原生應用程式更依賴 Play Integrity 和 App Attest,而非瀏覽器式的指紋評分。
用 BrowserInsight 把訊號綜合起來
沒有任何單一訊號是可靠的,這正是真實系統要對它們進行綜合評分的原因。你可以用 BrowserInsight 的機器人檢測工具在自己身上查看許多此類用戶端訊號:它會展示你的 navigator.webdriver 狀態、無頭與自動化痕跡、指紋一致性以及其他指標,讓你清楚地了解當你連線時,檢測系統究竟看到了什麼。
如果你想一次性看到這些單項檢測的實際效果,bot.sannysoft.com 和 CreepJS 等公開測試頁會執行許多同類探測並直接展示原始的通過/失敗結果——參見機器人偵測測試頁解析:Sannysoft 與 CreepJS,了解如何解讀這些結果,以及為什麼通過一個靜態測試頁並不等於通過一套會評分的真實偵測系統。
常見問題
能依靠 navigator.webdriver 來檢測機器人嗎?
單獨使用不行。它能抓到忘記隱藏它的簡陋自動化,但這個屬性極易被覆寫。應把它當作一個弱訊號,只有與無頭洩漏、行為資料和網路指紋結合時才有意義。
如果 User-Agent 被偽造,網站怎麼檢測無頭瀏覽器?
透過尋找 User-Agent 無法掩蓋的不一致:純軟體的 WebGL 算繪、相互矛盾的權限狀態、缺失的編解碼器,以及 Canvas 或音訊的異常算繪。一個與實際算繪環境相矛盾的偽造 User-Agent,本身就是很強的破綻。
自動化檢測等於封鎖所有機器人嗎?
不是。檢測負責對流量分類,策略才決定如何處置。網站通常會放行友善機器人(搜尋爬蟲、監控),限速激進的機器人,並對明顯濫用的自動化發起挑戰或封鎖。目標是把惡意流量與正常使用者及受歡迎的機器人區分開來。
為什麼說自動化檢測是一場貓捉老鼠的遊戲?
因為每一種檢測技術都會招來對策。網站檢查 User-Agent,攻擊者就偽造它;網站檢查 navigator.webdriver,攻擊者就修補它。防禦方則以更難偽造的網路層和行為訊號回應。雙方誰都無法永遠「獲勝」。


