User Agent 字串:讀取瀏覽器指紋
HTTP 請求中那串奇怪的 User Agent 字串能告訴你訪客的瀏覽器和作業系統資訊,但它經常誤導。學習如何正確解析 UA 並了解其局限性。
每個 HTTP 請求都包含一個 User-Agent 標頭。像這樣:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
這應該識別瀏覽器。實際上,這是一個歷史混亂。
為什麼每個瀏覽器都說謊
那個 Chrome user agent 提到 Mozilla、AppleWebKit、KHTML 和 Safari。Chrome 不是其中任何一個。
原因如下:網站過去會檢查 user agent 並提供不同的內容。新瀏覽器被封鎖,因為網站不認識它們。
所以瀏覽器開始說謊。「我與 Mozilla 相容」變成標準。「我與 AppleWebKit 相容」被添加。每個瀏覽器都聲稱是其他每個瀏覽器。
你實際上可以學到什麼
儘管混亂,user agent 仍然包含有用的資訊:
瀏覽器名稱和版本: 實際的瀏覽器通常在結尾。「Chrome/120」或「Firefox/121」。
作業系統:「Windows NT 10.0」或「Mac OS X 10_15_7」或「Linux」。
裝置類型: 行動 user agent 包含裝置名稱或「Mobile」。
機器人識別: Googlebot、Bingbot 和其他爬蟲會識別自己。
常見檢測模式
桌面 Chrome:
...Chrome/120.0.0.0 Safari/537.36
Android 上的行動 Chrome:
...Android 10; Pixel 4...Chrome/120.0.0.0 Mobile Safari/537.36
iPhone 上的 Safari:
...iPhone; CPU iPhone OS 17_0 like Mac OS X...Safari/605.1.15
Firefox:
...Firefox/121.0
Edge、Opera、Brave 和其他是基於 Chrome 的,看起來與 Chrome 類似。
為什麼功能檢測更好
User agent 檢測回答「什麼瀏覽器?」功能檢測回答「這個瀏覽器能做 X 嗎?」
// User agent 檢測(脆弱)
if (navigator.userAgent.includes('Chrome')) {
// 假設 Chrome 功能
}
// 功能檢測(強健)
if ('serviceWorker' in navigator) {
// 使用 service worker
}
瀏覽器會改變。User agent 字串會被修改。功能檢測無論如何都有效。
何時 User Agent 仍然重要
分析。 理解你的受眾:瀏覽器市場份額、行動 vs 桌面、作業系統分佈。
機器人檢測。 識別爬蟲並調整伺服器行為。
針對性測試。 重現使用者在特定瀏覽器上報告的問題。
舊版支援決策。 如果 0.1% 的使用者執行 IE11,也許你停止支援它。
欺騙和隱私
User agent 很容易偽造。隱私擴充會修改它們。有些瀏覽器讓使用者手動更改它們。
不要依賴 user agent 來提供安全性。它們是提示,不是認證。
瀏覽器指紋結合 user agent 與其他訊號(螢幕大小、字型、外掛)進行追蹤。這是有爭議的,並且越來越多地被瀏覽器封鎖。
Client Hint:現代替代方案
User-Agent Client Hint 是一種較新的方法。伺服器請求特定資訊:
Sec-CH-UA: "Chromium";v="120", "Google Chrome";v="120"
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Mobile: ?0
結構化、可靠、尊重隱私。但採用仍在增長。
解析函式庫
不要用正規表達式解析 user agent。邊緣情況會擊敗你。
使用維護模式資料庫的既定函式庫:
- ua-parser-js (JavaScript)
- user-agents (Python)
- DeviceDetector (PHP)
這些處理歷史混亂並在新瀏覽器出現時更新。
User agent 對於分析和診斷很有用,但對於功能決策不可靠。用函式庫解析它們,優先使用功能檢測來實現功能,並記住任何使用者都可以偽造他們的 user agent。