解讀 bot.sannysoft.com 和 CreepJS 到底檢測了什麼、如何看懂結果行,以及為什麼通過測試不等於通過真實的偵測系統。
搜尋「我是不是機器人」,兩個名字總會反覆出現:bot.sannysoft.com 和 CreepJS。兩者都是免費、無需註冊的頁面,會執行一整套用戶端檢測並直接顯示原始結果——沒有隱藏的分數,也無需任何解釋。它們在測試無頭 CI 流程的 QA 工程師中很受歡迎,也受到我們在機器人檢測技術一文中提到的那些自動化工具作者的關注。本文將解釋這兩個頁面各自檢測什麼、如何讀懂一行結果,以及——重要的是——為什麼在其中任何一個上拿到「全綠」並不等於通過了真正的正式環境偵測系統。
關鍵要點
- bot.sannysoft.com 會快速執行一張通過/失敗的檢測表,涵蓋經典的自動化破綻:
navigator.webdriver、window.chrome物件、外掛程式與權限檢測,以及 WebGL 算繪器字串。 - CreepJS 走得更深:這是一個開源專案,會透過多條獨立程式碼路徑交叉檢查同一個瀏覽器屬性,一旦某個隱身修補程式改了一條路徑卻漏掉了另一條,就會被標記為「謊言(lie)」。
- 一行顯示為綠色,只說明你的瀏覽器沒有觸發那一項特定的已知破綻——它無法說明你能否通過同時評估行為分析、TLS/HTTP-2 指紋和 IP 信譽的真實網站偵測系統。
- 這兩個工具都是獨立的社群專案,並非任何瀏覽器廠商的官方產品,隨著自動化框架的演進,它們的具體檢測項目也會不斷變化。
- BrowserInsight 自家的機器人檢測工具會為你目前的瀏覽器展示許多同類訊號,並附帶說明每一項的含義。
這些公開測試頁到底檢測了什麼
這兩個頁面都不是商業產品——它們都源自同一批研究者社群,我們在無頭瀏覽器偵測一文中也記錄了這個社群的工作;它們的目的,是讓任何人都能快速、透明地看到「我的自動化瀏覽器到底洩漏了什麼」。
bot.sannysoft.com 是兩者中更簡單的一個:開啟頁面,它會算繪一張表格,每一行對應一個已知的自動化破綻,標為綠色(像人類)或紅色(像自動化)。它會檢查諸如 navigator.webdriver 是否回傳 true、真實 Chrome 會暴露的 window.chrome 物件是否存在、navigator.plugins 的長度是否合理非零、Permissions API 回傳的結果是否內部一致,以及 WebGL 算繪器字串是否指向真實 GPU 硬體而非軟體光柵化器。這些正是我們在機器人檢測技術一文中更深入討論過的分類——Sannysoft 的頁面只是讓你一眼就能在自己的瀏覽器上看到它們的實際表現。
CreepJS(原始碼見 github.com/abrahamjuliot/creepjs)是一個規模大得多、MIT 授權的開源專案,專門用來抓住偽裝和隱身工具,而不只是未修補的裸自動化。它不只是讀取一次某個屬性值,而是透過幾條獨立的程式碼路徑——原型鏈、Web Worker 的隔離作用域、iframe 的獨立全域物件——讀取同一個值並進行比較。真實且未被修改的瀏覽器在每條路徑上給出的答案都一致。如果某個隱身修補程式在主執行緒上覆寫了 navigator.webdriver,卻忘了在 worker 內部做同樣處理,就會產生 CreepJS 標記為「謊言」的不一致。正是這種跨路徑比對,讓 CreepJS 對於那些專門試圖偽造指紋(而非僅僅執行未修補的自動化)的人來說,比 Sannysoft 的頁面更難矇混過關。
逐行讀懂檢測結果
兩個頁面表達的核心想法相同——觀察值與真實瀏覽器的預期值對比——但呈現方式不同。
在 Sannysoft 的表格中,每一行都會給出檢測名稱並依判定結果著色。真正值得留意的幾行包括:WEBDRIVER(在真實瀏覽器上應為 false 或缺失)、CHROME 行(真正的 Chrome 會暴露一個非空的 window.chrome 物件,許多自動化環境不會)、PLUGINS-LENGTH(一台真實的桌面 Chrome 安裝通常會回報一個小而非零的外掛程式清單)、PERMISSIONS 行(檢查查詢到的權限狀態是否內部一致,而非相互矛盾),以及 WebGL vendor/renderer 那幾行(軟體算繪器如 SwiftShader,而非真實 GPU 名稱,是最強的單一破綻之一,我們在無頭瀏覽器偵測一文中也有介紹)。
CreepJS 會在頂部展示一個綜合的信任分數,然後依類別拆分結果,把具體屬性單獨標記為一致或被檢測出「謊言」。單獨一條被標記的「謊言」往往比綜合分數更有資訊量——它能準確告訴你哪一層偽裝沒能覆蓋到每一條程式碼路徑,這對於偵錯自己的自動化設定比只看一個總分更有用。
請把這兩個頁面都當作在持續維護的專案:它們具體的行名、分類和評分方式會隨著維護者加入針對新發現破綻的檢測項而變化,所以本文說明的是底層的訊號分類,而不是針對某一個版本的固定手冊。
哪些訊號重要,哪些只是雜訊
不是每一行的權重都相同:
| 訊號 | 權重 | 原因 |
|---|---|---|
navigator.webdriver === true | 強 | 真實瀏覽器從不回報這個值;只有未修補的 WebDriver 工作階段才會 |
| WebGL 算繪器是軟體光柵化器 | 強 | 想要偽造需要真實的 GPU 存取權限,而大多數自動化環境都沒有 |
| CreepJS 標記的屬性「謊言」 | 強 | 一種內部不一致,真實且未被修改的瀏覽器結構上不可能產生 |
| 外掛程式清單為空或很短,單獨來看 | 弱 | 隱私瀏覽器和現代 Chrome 版本也會主動縮短這份清單 |
| 缺失舊版 API(例如 Battery Status) | 弱/雜訊 | 出於隱私原因,真實瀏覽器也在越來越多地移除或限制它,與自動化無關 |
規律很清楚:需要偽造瀏覽器如何算繪或暴露其自身內部結構的訊號很難偽造,因此也更有意義;而一台正常、注重隱私的瀏覽器本身也可能觸發的訊號,單獨看則較弱——這正是我們在機器人檢測技術一文中區分「單一訊號」與「組合評分」的原因。
這些測試頁與網站真實偵測系統的差異
無論是 Sannysoft 還是 CreepJS,單次頁面載入所能測量的,永遠只是靜態頁面能觀察到的內容:這一個瀏覽器、這一次請求、此時此刻。而一套正式環境的偵測系統會觀察得多得多——整個工作階段中的滑鼠與鍵盤時序、JavaScript 層之下的 TLS 與 HTTP/2 交握指紋、IP 信譽與請求速率,以及某個指紋長期與其他數千名訪客相比呈現出怎樣的叢集。這些都不會出現在單頁測試中,因為它們需要瀏覽器端頁面根本沒有的歷史資料和網路層可見性。
這意味著,在兩個測試頁上都拿到「全綠」,說明你的設定避開了那些廣為人知的靜態破綻——這對於稽核 CI 流程或自動化工具的人確實很有用——但這並不能證明你能通過一套真實的商業反機器人系統,因為那些系統恰恰疊加了靜態頁面無法看到的訊號。如果你的自動化瀏覽器還需要一個可信的 User-Agent,我們關於偵測 User-Agent 偽造的文章介紹了與上述內容並行運作的標頭和 Client Hints 層面的檢測。
用 BrowserInsight 檢測你自己的瀏覽器
如果你想看到這些訊號針對你目前的瀏覽器給出的解釋,而不是一張乾巴巴的通過/失敗表格,BrowserInsight 的機器人檢測工具會回報你的 navigator.webdriver 狀態、外掛程式與權限一致性,以及 WebGL 算繪器——每一項都附有淺顯易懂的說明,且全部在用戶端計算完成。
常見問題
Sannysoft 和 CreepJS 是 Google 或瀏覽器廠商的官方工具嗎?
不是。兩者都是獨立的社群專案,與任何瀏覽器廠商無關。它們在機器人偵測與自動化工具社群中被廣泛用作非正式、透明的參考檢測——而不是對任何事物的官方認證。
如果我在 CreepJS 上拿到高信任分數,就能避免被真實網站封鎖嗎?
不一定。高信任分數只說明你的瀏覽器沒有觸發 CreepJS 執行的那些特定檢測項目。真實網站的反機器人系統還會對行為、網路指紋、IP 信譽以及跨多次請求的歷史進行評分,而這些都不是單次測試頁面載入能評估的。
為什麼 Sannysoft 和 CreepJS 對同一個瀏覽器有時會給出不同結論?
因為它們檢測的深度和內容不同。Sannysoft 關注一小組經典且廣為人知的破綻;CreepJS 則跨多條獨立程式碼路徑交叉檢查大量屬性,專門用來抓住那些已經能騙過簡單檢測的偽裝。同一套設定可能在一個頁面上顯示乾淨,卻在另一個頁面上被標記出來。
用這些頁面測試自己的自動化設定是否合規?
是的——這正是它們最常見的用途之一。在 CI 中執行無頭瀏覽器的 QA 團隊,以及研究偵測技術的研究者,都會用這些頁面提前看看目標網站的偵測層可能會注意到自己設定的哪些地方,而不必等它真正上線才發現問題。


