我在用什么浏览器
显示你的浏览器、排版引擎、作业系统与 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 值得多说一句。它从来只是请求而非要求,而在几乎没有网站遵守的情况下,送出这个标头 反而让浏览器更容易被识别,而不是更难。多数浏览器现在已经拿掉这个设定了。
这里没有任何东西被送出去
每一个数值都是从你自己的浏览器读出来再显示的。这一页没有服务器端。这件事有点讽刺:一个讲「你的 浏览器泄漏了什么」的页面,正好是把这些全部留在原地的页面。