Chrome 的 User-Agent 縮減功能凍結了 UA 字串中的次版本號、系統版本與裝置型號。了解具體變化、原因與替代方案。
如果你 Chrome 的 User-Agent 字串顯示為 Chrome/143.0.0.0,而 chrome://version 裡的真實建置編號卻是 143.0.7499.96 之類的四段數字,兩邊你都沒有看錯——Chrome 確實不再回報自己的精確版本了。這不是錯誤,而是 Chrome **User-Agent 縮減(User-Agent Reduction)**計畫刻意為之的結果:這項持續多年的努力,把被動廣播的 UA 字串削減為資訊量極低的存根,同時把具體細節移到了一個需按需請求的 API 中。以下來看看具體移除了什麼、替換成了什麼,以及這些被凍結的值對偽裝偵測意味著什麼。
核心要點
- Chrome 的 User-Agent 縮減從 UA 字串中移除了三項內容:次版本/建置/修補版本號、精確的作業系統版本,以及裝置型號。
- 主版本號之後的部分現在一律寫作
0.0.0——無論實際是哪一個修補版本,Chrome 143 都統一回報Chrome/143.0.0.0。桌面版系統字串也被凍結為固定值,例如自 Windows 10 起的所有 Windows 版本都統一寫作Windows NT 10.0。 - Android 裝置型號被替換為通用佔位符
K,回報的 Android 版本也一律凍結為10,與真實裝置和系統版本無關。 - 被移除的細節並未消失,而是轉移到了 User-Agent Client Hints(UA-CH)——只有伺服器明確要求時才會揭露。
- 由於凍結後的 UA 不再隨真實更新而改變,當它與瀏覽器真實的、透過特性偵測得出的引擎版本不一致時,反而是更強的偽裝訊號,而非更弱的訊號。
具體移除了什麼
根據 MDN 的 User-Agent 縮減參考文件,Chrome 的縮減恰好針對三個欄位:
- 精確的平台/系統版本——不再是你真實的 Windows 版本、macOS 具體版本或 Android 版本。
- 裝置型號——Android 手機/平板的型號字串被移除。
- 瀏覽器次版本號——只有主版本號仍有意義,其餘部分一律歸零。
替換後的值是固定的,而非近似值——同一平台上的每一台裝置回報的字串完全相同:
| 平台 | 凍結後的值 |
|---|---|
| Windows | Windows NT 10.0; Win64; x64(Windows 10 與 11 皆是如此) |
| macOS | Macintosh; Intel Mac OS X 10_15_7 |
| Linux | X11; Linux x86_64 |
| ChromeOS | X11; CrOS x86_64 14541.0.0 |
| Android | Android 10; K(真實裝置型號被字母 K 取代) |
用一組真實的前後對比就能看清效果。以前 Chrome for Android 的真實 UA 大概是這樣:
Mozilla/5.0 (Linux; Android 16; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.7499.96 Mobile Safari/537.36
縮減後,同一台裝置回報的變成了:
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36
真實的 Android 16 版本和 Pixel 9 型號名都消失了,主版本號之後的 0.7499.96 也統統歸零為 0.0.0。主版本號(143)被保留了下來,因為網站確實需要它來做相容性判斷——它是唯一仍在被動廣播的版本細節,也確實會隨 Chrome 升級而遞增。
Google 為何選擇凍結而非直接刪除
2021 年 Chromium Blog 的原始公告將問題歸納為 UA 字串的兩個缺陷:無論是否有指令碼發起請求,它都會在每次請求中被動暴露大量身分資訊;而且其非結構化的自由格式讓它成為維護上的負擔——瀏覽器無法安全地改動它,因為許多網站依賴對其做模式比對。若直接刪除這些欄位,會瞬間破壞所有依賴 UA 嗅探的指令碼。而將它們凍結為固定的、被廣泛共享的值,則既保留了字串的格式(老舊解析器不會崩潰),又讓具體的值失去了識別價值——因為如今數百萬台互不相關的裝置都發出了位元組級完全相同的字串。
這次上線過程被刻意拉長,橫跨了許多個 Chrome 版本:先是 Origin Trial(來源試用),再逐階段淘汰舊行為,且桌面版先行、Android 在後。這樣安排正是為了讓那些依賴精細 UA 資料(裝置型號、精確的系統版本、精確次版本號)的網站,有足夠時間在舊行為徹底停止之前遷移到明確的替代方案。
被移除的細節轉移到了哪裡
沒有任何東西被真正丟棄——Chrome 為這些資訊專門搭建了一條並行通道:User-Agent Client Hints(UA-CH)。舊版 UA 預設廣播一切,而 UA-CH 反其道而行:一小部分低熵提示(品牌、是否行動裝置、平台名稱)仍會自動送出,但縮減移除的高熵資料——完整版本號、精確系統版本、裝置型號——現在只有當伺服器送出 Accept-CH 請求標頭明確索取時才會釋出,用戶端則透過 navigator.userAgentData.getHighEntropyValues() 讀取。這些資訊依然存在,只是不再主動交給每一個什麼都沒問的伺服器。
為什麼網站和指令碼會因此出問題
任何解析 UA 字串以取得「哪個瀏覽器、大致哪個主版本、是行動裝置還是桌面」以外細節的程式碼,現在都會得到過時或錯誤的答案。曾經依賴 Android 型號字串做判斷的裝置偵測函式庫、記錄精確系統版本號的統計指令碼,或依賴 navigator.userAgent 做精確版本檢查的 QA 工具,都會悄悄退化——它們不會報錯,只是默默地對每個使用者都回傳 0.0.0 和 K。這正是這次取捨的代價:真實的隱私收益(每次請求的被動指紋面顯著縮小)由那些沒能及時遷移到 UA-CH 的一方,以相容性債務的形式買單。
偵測層面的意義:被凍結的 UA 說得更少,兩邊皆然
對指紋識別和偽裝偵測而言,縮減帶來了一個有趣的副作用。以前,UA 的修補版本號會隨每一次真實更新而前進,因此一個明顯過時的聲稱版本本身就是個(雖弱但存在的)線索。現在,縮減後的 UA 本該看起來是靜態的——修補版本之間那串 0.0.0 紋風不動才是正常狀態,光看字串,剛裝好的瀏覽器和好幾個月沒更新的瀏覽器毫無區別。這消除了一個較弱的訊號,但沒有消除真正重要的訊號:網頁仍然可以透過特性偵測,獨立於凍結的 UA 字串所聲稱的內容,去詢問 JavaScript 引擎它實際執行的到底是哪個渲染核心、哪個版本。如果一個瀏覽器的 UA 聲稱是 Chrome 143,但其真實的、透過特性偵測得出的引擎版本明顯更舊或更新——或者完全屬於另一個引擎家族——這種矛盾正是如何偵測 User-Agent 偽裝一文所討論的那類訊號。BrowserInsight 的核心檢測工具會執行這套特性偵測探測,並將結果與你聲稱的 UA 並排顯示,讓你直接看出兩者是否相符。
親自試試看
開啟 DevTools 並執行 navigator.userAgent。如果你用的是較新版本的 Chrome(或任何現代 Chromium 核心瀏覽器),應該會看到主版本號之後的部分都是 0.0.0——把它和 chrome://version 裡那個四段式建置編號一比,就能看清究竟隱去了什麼。在 Android 上,檢查裝置權杖是否顯示為 K 而非你真實的型號名稱。然後用 BrowserInsight 的核心檢測工具與你真實的引擎版本做比對——該工具會獨立於(如今已凍結的)UA 字串所聲稱的內容,偵測你真實的渲染核心。
常見問題
Firefox 與 Safari 也凍結了它們的 User-Agent 字串嗎?
沒有,縮減是 Chromium 專屬的計畫;Firefox 與 Safari 仍然送出傳統的、未經縮減的 UA 字串。只有基於 Chromium 的瀏覽器(Chrome、Edge、Brave、Opera 及其他同源瀏覽器)會套用本文所述的凍結值。
Chrome for iOS 也適用 User-Agent 縮減嗎?
不適用。iOS 上的 Chrome 被要求使用蘋果的 WebKit 引擎,而非 Chromium 自家的 Blink 引擎;縮減的適用範圍僅限於基於 Blink 的 Chrome,並不涵蓋 Chrome for iOS 和 Android WebView——這兩者仍然送出傳統的 UA 字串。
我的網站會因此出問題嗎?
只有當它直接從 navigator.userAgent 或 HTTP 請求標頭中讀取精細的 UA 欄位——精確系統版本、裝置型號或瀏覽器次版本號——才會受影響。若是如此,請遷移到 User-Agent Client Hints,它仍能透過明確請求提供這些細節。只檢查瀏覽器家族與主版本號的程式碼不受影響。
凍結後的 0.0.0 版本號本身可疑嗎?
不可疑——這是如今每一個真實、最新的 Chromium 瀏覽器的預期預設值,本身不帶任何訊號。真正可疑的是,凍結後的 UA 與其他獨立偵測出的訊號(例如瀏覽器真實的、特性偵測得出的引擎版本,或其 client hints 資料)不一致。
結論
User-Agent 縮減是一次安靜卻刻意為之的權衡:Chrome 保留了 UA 字串的格式以避免災難性的破壞,同時將其中每一個具體的、可識別的值都替換成了數百萬台裝置共享的固定字串。這些細節並未消失,而是轉移到了 User-Agent Client Hints——一個僅在明確要求時才揭露資訊的 API。對於從事指紋識別或偽裝分析的人來說,實際的結論是:UA 字串本身如今幾乎不值得單獨信任;真正重要的是,它是否與瀏覽器難以輕易偽造的其他訊號相符。
延伸閱讀:

