「我正在使用什麼瀏覽器」這類檢查的準確度,取決於瀏覽器選擇公開哪些欄位,而這些欄位的設計目的是相容性,而非身分驗證。傳統的使用者代理字串是一段凍結的相容性字塊,可能同時出現 Mozilla、AppleWebKit、Chrome、Safari 及其他權杖,但這並不代表真的有五個產品在運作。現代的 Client Hints 會加入結構化的品牌清單,但瀏覽器可能會塞入 GREASE 佔位符,以防止程式碼預設固定的順序,甚至有些瀏覽器完全不公開任何有意義的品牌。平台、行動裝置提示、語言與 Cookie 設定各自只回報一項狹隘的資訊,單憑這些並無法證明裝置類型、位置或儲存空間是否可用。因此,一個準確的答案應該像一份透明的清單,誠實列出瀏覽器回報的內容——當產品名稱沒有被公開時,也要誠實地提供備用說明——而不是從脆弱的字串比對中推導出一個自信的標籤。

what browser am i using accuracy
「我正在使用什麼瀏覽器」的偵測到底有多準?

對瀏覽器檢查來說,「準確度」真正的含義

當你搜尋方法來確認正在執行哪一個瀏覽器時,你通常是想回答下列三個實務問題之一:對於一個運作異常的網站,我是否使用了受支援的瀏覽器;該把什麼字串貼進支援單裡;以及我的環境中是否有任何東西在謊報自己的身分。這幾種情境下所謂的「準確」,並不等於「從一長串不透明的字串中猜對產品名稱」。它更接近於:告訴我瀏覽器願意公開的精確欄位、誠實標示每個欄位,並在缺少標籤時如實告知,而不是用一個自信的猜測來填補。

這個區別很重要,因為幾乎所有老舊「我的瀏覽器是什麼」頁面的失敗模式,都來自於過度推論。一個內建冗長使用者代理樣式對照表的頁面,仍然可能被字串縮減、瀏覽器自帶的相容性權杖、webview、企業覆寫、隱私擴充功能,以及遠端瀏覽器服務所擊敗。一個只呈現瀏覽器本身回報內容的頁面——在可用時使用 navigator.userAgentData、只有在平台標籤時退而使用 navigator.platform、並永遠保留 navigator.userAgent、語言與 cookieEnabled——是用自信換來誠實。這種取捨,是瀏覽器端工具所能誠實提供的最準確契約。

為什麼使用者代理字串不是可靠的身分來源

使用者代理字串最初的作用,是告訴伺服器是哪一個瀏覽器引擎在與它溝通,之後便一路堆積出歷史包袱。一個現代 Chrome 系列字串可能同時包含 Mozilla、AppleWebKit、Chrome 與 Safari 等獨立權杖。Safari 字串可能包含 Safari、Version 與 Mobile。Firefox 字串則包含 Gecko 與 Firefox。這些權杖單獨來看,都無法證明對應的產品真的有安裝或正在執行,而且權杖的順序也不固定。

要把字串對應到一個有把握的產品與精確版本,需要一個持續維護的解析器、一份不斷更新的樣式對照表,以及一套能跟上瀏覽器廠商每年多次變更的機制。即便如此,結果仍可能被以下情況擊敗:

  • 偽造——瀏覽器或擴充功能刻意改寫字串。
  • 嵌入——webview 顯示的是宿主應用程式的字串,而非使用者的瀏覽器。
  • 縮減——瀏覽器為了隱私而截短字串,移除解析器所依賴的版本權杖。
  • 凍結值——企業政策將字串鎖定為已知的舊值。
  • 遠端瀏覽器服務——使用者技術上在一個瀏覽器中,但伺服器由另一個瀏覽器負責渲染頁面。

請將原始的使用者代理值視為不透明的相容性字串。它對支援團隊與需要它的錯誤報告很有用,但並非已驗證的身分,無論做多少樣式比對都不會改變這個事實。

回報的品牌清單實際上包含什麼

User-Agent Client Hints 會在瀏覽器實作該介面時,透過 navigator.userAgentData.brands 公開一組結構化的品牌與版本陣列。每個項目由瀏覽器自行決定內容與順序。為了防止程式碼假設固定的品牌清單或順序,瀏覽器可能加入一個 GREASE 風格的佔位符,設計上看起來像真實品牌,實際上卻毫無意義。最常見的佔位符名稱就是字面上的「Not A Brand」,通常會搭配一個刻意亂寫的版本。

一個準確顯示品牌清單的頁面應做到兩件事:保留瀏覽器提供的順序與內容,並且只過濾掉那個已知的無意義佔位符,不要再對清單做其他重排。如果瀏覽器沒有公開任何有意義的品牌——可能是介面不存在、所有項目都被過濾掉,或是瀏覽器根本沒有實作 Client Hints——頁面應該用白話說明,而不是從脆弱的權杖順序中虛構一個結果。這正是「瀏覽器名稱未公開」訊息的用途。

版本號碼也適用同樣的警慎。品牌項目只是一個由瀏覽器選擇的版本號,未必是真實安裝的版本。被偽造或縮減過的瀏覽器可以給出任何它想要的版本字串,而誠實的回報會保留那個值,而不是試圖「修正」它。

這些欄位各自承載一個狹隘的意義,很容易被過度解讀。下表整理了每個欄位的回報內容,以及它無法證明的事項。

欄位瀏覽器回報的內容它無法證明的事
品牌清單 (Client Hints)由瀏覽器選擇的品牌與版本配對,順序也由瀏覽器決定該產品確實已安裝、版本是真的,或清單未被修改
使用者代理字串一段含有多個內嵌權杖的歷史相容性字串哪一個瀏覽器正在執行、精確版本,或該字串沒有被改寫
平台可用時為 Client Hints 的平台,否則為 navigator.platform底層作業系統、裝置類別或安裝路徑
行動裝置提示Client Hints 介面在有提供時所回傳的布林值瀏覽器執行於手機、螢幕較小、支援觸控,或任何特定裝置型號
語言navigator.language,瀏覽器偏好的內容語言使用者的位置、帳號語系、鍵盤配置或內容偏好
Cookies 已啟用瀏覽器回報的 cookieEnabled 值每次 Cookie 寫入都會成功、任何特定網站都能儲存 Cookie,或允許追蹤

Cookie 值得特別說明,因為這個欄位經常被誤讀。cookieEnabled 為 true,只代表瀏覽器的一般設定。第三方 Cookie 限制、分區、私密模式、過期設定、網域與路徑規則、同意選擇、擴充功能與企業控管,仍然可能封鎖特定的 Cookie。一個回報這個欄位的工具並不會建立測試 Cookie、推論追蹤可用性,或衡量儲存空間的存取。

逐步使用「我正在使用什麼瀏覽器」工具

這個頁面刻意保持精簡。它會在本機讀取欄位、透明地顯示,並提供一個匯出動作。若要取得有用的報告,請依序完成下列步驟。

  1. 在與你看到問題的同一個瀏覽器分頁中,開啟 我正在使用什麼瀏覽器 工具。
  2. 檢視報告頂端的品牌清單,並留意頁面是否誠實地標示瀏覽器名稱未公開。如果你看到該訊息,表示瀏覽器並未提供有意義的 Client Hint 品牌,這時你從下方的使用者代理字串推測出的任何產品名稱都不具權威性。
  3. 比較報告其餘各節中的平台、行動裝置提示、語言、Cookie 設定,以及原始的相容性使用者代理字串。每個值只會在頁面載入時讀取一次,因此若環境有變動請重新載入頁面。
  4. 選擇「複製瀏覽器報告」,並在進行故障排除時附上重現步驟。匯出內容僅包含可見值的純文字,除瀏覽器自行公開的內容外,不包含任何其他隱私資訊。
  5. 不要將複製的文字視為已驗證的身分。在送交支援之前,請一併附上失敗的網址、發生問題的時間、完整重現步驟、螢幕擷圖、你的擴充功能狀態,以及私密模式是否會改變行為。

這份報告無法證明的事

由於頁面上的每個欄位都來自瀏覽器本身的介面,因此這份報告無法證明已安裝的應用程式、可執行檔簽章、更新通道、安全性修補等級、裝置擁有者,或字串是否曾被修改。它同樣無法證明功能支援性。單憑一個回報的品牌,並不能證明某個特定 Web API 可用、某項安全功能已啟用,或該瀏覽器符合廠商目前的支援清單。對於攸關「是否支援」的決定,請對所需 API 進行功能偵測,並參考產品本身的「關於」或更新畫面。

這個頁面也不會將任何資料上傳、指紋化或保存到伺服器。剪貼簿的存取只會在你選擇「複製瀏覽器報告」之後發生。如果你所在的組織使用遠端瀏覽器服務或受管理的裝置設定,所顯示的數值就是該設定選擇公開的內容,並不代表底層機器的真實狀態。

何時應信任這份報告,以及何時需要補充更多脈絡

這份報告作為「瀏覽器告訴頁面的內容」是可信的;但若作為身分或能力的證明,則不可信。最準確的使用方式,是將複製的文字連同網址、時間戳記、重現步驟、螢幕擷圖、擴充功能清單,以及是否為私密模式的註記,一起附加到錯誤報告中。若想針對欄位的意義取得第二意見,可以參考一篇以更深入的方式說明如何解讀同一組欄位的姊妹指南,請參閱文章 瀏覽器版本檢查器:讀懂瀏覽器回報的內容。若要確認功能支援,請信任功能偵測與瀏覽器本身的「關於」畫面,而不是任何第三方標籤。

結合「透明的本機報告」、「當品牌未公開時誠實的備用說明」,以及「讓真人審閱者能重現錯誤所需的實際脈絡」,是一個瀏覽器端工具所能誠實給出的最準確答案。

如果你正在比較選項,以 Client Hints 打造的「我正在使用什麼瀏覽器」替代方案 對此有詳細說明。