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"。
Bot识别: 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桌面、操作系统分布。
Bot检测。 识别爬虫并调整服务器行为。
针对性测试。 重现用户在特定浏览器上报告的问题。
遗留支持决策。 如果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。