我在用什麼瀏覽器
顯示你的瀏覽器、排版引擎、作業系統與 User-Agent 字串,以及瀏覽器實際支援哪些功能。說明為何字串只是猜測、功能偵測才不是。
在你的瀏覽器中執行
- 瀏覽器
- —
- 排版引擎
- —
- 作業系統
- —
- 語言
- —
- 時區
- —
- CPU 核心數
- —
- 裝置記憶體
- —
- 網路連線
- —
- Cookie 已啟用
- Do Not Track
- —
上面的瀏覽器與系統是從 User-Agent 字串讀出來的,而每一種瀏覽器都刻意在這個字串裡造假。請當成一個還不錯的猜測。
—
上半部是猜的
上面的瀏覽器、引擎與系統,都是從你的 User-Agent 字串讀出來的,而那個字串不是事實陳述。 每一種瀏覽器都刻意宣稱自己是好幾種別的瀏覽器,理由是三十年前的相容性問題。
Mac 上的 Chrome 會說:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
這是一個瀏覽器同時宣稱自己是 Mozilla、AppleWebKit、KHTML、Gecko 與 Safari,而它一個都不是。 這個慣例始於當年網站會先檢查是不是 Netscape 才提供框架,於是後來每一個瀏覽器都把前一個的名字 加進去以免被擋掉,之後就再也停不下來了。
要解析它,就得依正確的順序去測那些冒名者——Edge 要排在 Chrome 前面,Chrome 要排在 Safari 前面 ——並且接受一件事:新出現的瀏覽器會被誤判成它模仿的那一個。
字串講不出來的事
iPad 會說自己是 Mac。 自 iPadOS 13 起,它的字串和 macOS 上的 Safari 完全相同。唯一剩下的 線索是有沒有觸控支援,這就是本頁把兩者並列的原因。
iOS 上的每個瀏覽器都是 Safari 的引擎。 iPhone 上的 Chrome、Firefox 與 Edge 都必須使用
WebKit,差別只在字串裡的品牌名。看到 CriOS,那是 Chrome 的介面套在 Safari 的引擎上。
版本號正在被凍結。 Chrome 與 Edge 已經縮減回報內容:次要版本號被歸零,平台資訊被泛化。 這是為了降低指紋辨識,也代表這個字串正在刻意變得更沒有資訊量。
功能支援才是答案
下方那份清單是瀏覽器實際做得到什麼,直接測出來的,不是推論的。這才是 User-Agent 字串被拿來 回答的那些問題的正確答案:
// 脆弱——新瀏覽器出現、或字串改了就壞
if (/Safari/.test(navigator.userAgent)) { … }
// 正確——問的就是你真正想問的
if ('showOpenFilePicker' in window) { … }
功能偵測不可能對「現在」判斷錯誤。UA 判別則是在猜「這個名字代表支援哪些功能」,而每當某個瀏覽器 新增能力、或有新瀏覽器出現,它就錯一次。
這個字串只有兩種誠實的用途:告訴人類他正在用哪一個瀏覽器——也就是這一頁在做的事——以及 繞過某個特定版本裡有紀錄的特定臭蟲。除此之外都該用功能偵測。
User-Agent Client Hints
Chromium 系的瀏覽器透過 navigator.userAgentData 把同樣的資訊以結構化資料提供,敏感的部分要
另外索取。它解決了解析的問題,沒有解決信任的問題:瀏覽器在那裡一樣可以回報任何它想回報的東西。
Firefox 與 Safari 都沒有實作,所以那個字串短期內不會消失。
其他幾項讀數
| 讀數 | 但書 |
|---|---|
| 語言 | 你的 Accept-Language 順序,網站用它挑語系 |
| 時區 | 從你的系統時鐘推得,不是從你的位址 |
| CPU 核心數 | 可能被上限或取整,以降低指紋辨識 |
| 裝置記憶體 | 只有 Chromium 有,而且刻意粗略——超過 8 一律回報 8 |
| Do Not Track | 幾乎沒有網站理會,且正被瀏覽器移除 |
Do Not Track 值得多說一句。它從來只是請求而非要求,而在幾乎沒有網站遵守的情況下,送出這個標頭 反而讓瀏覽器更容易被識別,而不是更難。多數瀏覽器現在已經拿掉這個設定了。
這裡沒有任何東西被送出去
每一個數值都是從你自己的瀏覽器讀出來再顯示的。這一頁沒有伺服器端。這件事有點諷刺:一個講「你的 瀏覽器洩漏了什麼」的頁面,正好是把這些全部留在原地的頁面。