JavaScript 指紋識別與機器人偵測:網站如何識別你
重點摘要
- JavaScript 指紋識別 收集 50 多個瀏覽器特徵來建立唯一識別碼,比 Cookie 更持久,更難封鎖。
- 關鍵指紋識別信號包括 Canvas、WebGL、AudioContext、字型、螢幕屬性和 Navigator API 資料.
- 防機器人系統結合 JS 指紋識別與 TLS 指紋識別 (JA3/JA4) 以及行為分析,實現高度準確的機器人偵測。
- 無頭瀏覽器 (Puppeteer、Playwright) 和自動化工具會留下 可偵測的痕跡 被指紋識別暴露,如缺失的 API、相同的輸出、時序異常。
- 偽裝指紋識別是可能的,但難度日益提高,防機器人系統使用 一致性檢查 來捕捉不匹配的偽裝值。
目錄
每次你造訪網站時,你的瀏覽器都會無聲地洩露數十項獨特特徵,包括你的螢幕解析度、GPU型號、已安裝的字體、音訊處理特性,以及瀏覽器渲染隱形canvas元素的確切方式。這些信號組合在一起,會產生一個 瀏覽器指紋 它就像人類指紋一樣獨一無二。
這項技術支撐著現代機器人偵測系統、詐欺防範和反自動化防禦。無論你是在保護網站免受機器人侵害,還是想要瞭解為什麼某些安全系統會對你的流量提出質疑,瞭解其工作原理都至關重要。
什麼是JavaScript指紋識別?
JavaScript指紋識別是一種利用瀏覽器端JavaScript API來收集設備和環境特徵的技術,為每個瀏覽器session建立唯一識別符。與可被用戶刪除的Cookie或會改變的IP位址不同,指紋具有以下特性:
- 持久性: 在清除Cookie、私密瀏覽和瀏覽器重啟後仍能保留
- 唯一性: 超過50個信號的組合在數百萬個瀏覽器中產生獨特的指紋
- 被動性: 收集過程在無需用戶互動的情況下無聲進行
- 難以偽造: 改變一個信號通常會與其他信號產生可檢測的不一致
瀏覽器指紋如何運作
指紋識別script通常分三個階段運作:
- 收集: JavaScript API查詢瀏覽器屬性,包括navigator物件、螢幕屬性、canvas渲染、WebGL功能、AudioContext處理等
- 雜湊化: 收集的值被組合並雜湊化(通常使用SHA-256或MurmurHash3)成一個緊湊的指紋字串
- 比對: 該雜湊值與已知指紋進行比對,檢查是否與先前訪問者、已知的機器人工具或偽造環境相匹配
主要指紋信號
Canvas指紋識別
最強大的指紋識別信號。隱藏的<canvas>元素繪製文字、形狀和漸層。像素級輸出根據GPU、驅動程式版本、字體渲染引擎和反鋸齒實現方式而異。兩個不同的設備幾乎不可能產生相同的canvas輸出。
WebGL指紋識別
WebGL洩露GPU資訊(渲染器、供應商)並產生獨特的渲染輸出。WEBGL_debug_renderer_info擴展洩露確切的GPU型號。結合WebGL渲染測試,這會產生強大的硬體指紋。
AudioContext指紋識別
Web Audio API由於硬體和軟體差異,在各設備上的音訊信號處理方式不同。透過生成振盪器並分析輸出,指紋識別script可以捕捉獨特的音訊處理特性。
字體指紋識別
不同的OS版本、語言包和已安裝的應用程式會增加獨特的字體集合。透過測量各種字體中文字的渲染寬度和高度,script能夠判定已安裝的字體,進而建立基於字體的指紋。
Navigator與螢幕屬性
| 信號 | 洩露內容 | 熵 |
|---|---|---|
| navigator.userAgent | 瀏覽器版本、作業系統、裝置類型 | 中等(容易被偽造) |
| navigator.language | 偏好語言 | 低-中等 |
| navigator.hardwareConcurrency | CPU核心數 | 低 |
| navigator.deviceMemory | 記憶體容量(近似值) | 低 |
| screen.width/height | 顯示器解析度 | 中等 |
| screen.colorDepth | 色彩深度功能 | 低 |
| navigator.platform | 作業系統平台字串 | 低(已棄用) |
| navigator.maxTouchPoints | 觸控功能 | 低 |
| Intl.DateTimeFormat().resolvedOptions().timeZone | 時區 | 中等 |
其他高價值信號
- WebRTC洩露: 即使透過VPN也可能洩露本地和公開IP位址
- 電池API: 電池電量和充電狀態(因隱私考量在大多數瀏覽器中已棄用)
- 權限狀態: 通知、定位、攝像頭權限是否已授予或拒絕
- 客戶端提示: Chrome的User-Agent客戶端提示提供結構化裝置資料
- CSS媒體查詢: 偵測暗色模式偏好、動作簡化、對比度偏好
TLS指紋辨識(JA3/JA4)
TLS指紋辨識在連線層級運作,在任何JavaScript執行之前
JA3 指紋辨識
由 Salesforce 開發,JA3 對 TLS Client Hello 訊息的組件進行雜湊處理,包括 SSL 版本、密碼套件、擴展、橢圓曲線和 EC 點格式。每個 HTTP 用戶端(Chrome、Firefox、Python requests、Go http、curl)都會產生獨特的 JA3 雜湊值。即使使用者代理標頭遭到偽造,JA3 仍能識別出實際的用戶端軟體。
JA4 指紋辨識
較新的 JA4 標準改進了 JA3,具有更易於人類閱讀的格式和更佳的版本追蹤。它建立的指紋字串如「t13d1715h2_8daaf6152771_b0da82dd1658」,其中編碼了 TLS 版本、密碼套件計數、擴展計數和 ALPN 值。
反機器人系統如何使用指紋辨識
現代反機器人解決方案如 Cloudflare Bot Management、Akamai Bot Manager 和 DataDome 將指紋辨識與多重檢測層相結合:
- TLS 指紋檢查: 驗證連線來自真實瀏覽器,而非 HTTP 庫
- JavaScript 執行: 執行指紋收集指令稿,無法執行 JS 的機器人會立即被標記
- 一致性驗證: 檢查 JS 指紋是否與 TLS 指紋相符(例如,JA3 顯示 Chrome 但 canvas 顯示無頭,就標記為異常)
- 已知機器人比對: 將指紋與已知機器人工具特徵的資料庫進行比對
- 行為疊加層: 將指紋分數與滑鼠移動、點擊時序和滾動模式相結合
偵測無頭瀏覽器
無頭瀏覽器(Chrome headless、Puppeteer、Playwright)會留下明顯跡象:
- navigator.webdriver: 設為
true在自動化瀏覽器中(可被偽造但能透過原型檢查偵測) - 缺少 chrome 物件:
window.chrome在無頭 Chrome 中缺失或不完整 - 外掛計數: 真實 Chrome 會報告外掛,無頭 Chrome 通常報告為零
- WebGL 廠商不符: 無頭環境常報告「Google Inc. (Google SwiftShader)」,這是軟體渲染器
- 通知權限: 無頭瀏覽器無法請求通知權限,透過 API 行為可將其識別
- Iframe contentWindow: 無頭 Chrome 對跨來源 iframe 存取的處理方式不同
- 時序異常: 自動化瀏覽器以非人類速度執行 JavaScript,或具有完全一致的時序
指紋偽造與反偵測
多個工具嘗試修改瀏覽器指紋:
| 工具 | 方法 | 偵測風險 |
|---|---|---|
| GoLogin | 可設定指紋配置檔的自訂 Chromium | 中等 |
| Multilogin | 具有深度指紋自訂功能的瀏覽器模擬工具 | 中等 |
| Puppeteer Extra (Stealth) | 修補可偵測 Puppeteer 人工製品的外掛程式 | 中等到高 |
| undetected-chromedriver | 經過修改的 ChromeDriver,可避免常見的偵測 | 中等到高 |
| 瀏覽器擴充功能 | Canvas 阻擋器、WebGL 欺騙 | 高(會增加可偵測的人工製品) |
網站所有者的防禦策略
如果您要保護網站免受機器人攻擊,應將指紋識別作為分層防禦的一部分:
- 使用託管解決方案: Cloudflare、Akamai 或 DataDome 大規模處理指紋識別
- 結合速率限制: 指紋識別可識別機器人,速率限制則限制其影響
- 新增行為分析: 指紋識別 + 滑鼠追蹤 + 點擊時間 = 全面的偵測
- 在受 DDoS 保護的基礎設施上部署: 指紋識別在應用程式層運行,您還需要網路層的 DDoS 保護 也是如此
- 定期更新偵測: 機器人工具不斷演進,您的偵測必須更快地跟上
隱私隱憂
瀏覽器指紋識別引發了重大隱私疑慮。主要瀏覽器越來越多地限制指紋識別功能:
- Firefox: 提供指紋抵抗模式,可標準化 Canvas、WebGL 及其他輸出
- Safari: 限制 Canvas 回讀並限制字體列舉
- Chrome: 透過 Client Hints 和 Privacy Sandbox 減少使用者代理資訊洩露
- GDPR/隱私法規: 裝置指紋識別可能構成個人資料蒐集,在歐盟需要取得同意
保護您的網站免受機器人攻擊
我們的安全團隊為遭受攻擊的網站和應用程式提供完整的機器人偵測、裝置指紋識別、DDoS 防護和 WAF 設定服務。
Telegram: @unlednetwork → WhatsApp 聯繫我們 →
留言
有問題或親身經驗嗎?加入討論。您的電子郵件不會公開。
We implemented this last month and already seeing positive signals.
Appreciate you sharing this. We've refined our playbook for exactly this scenario and it aligns with the article.