目录
User-Agen
User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。
浏览器通常使用的格式为
User-Agent: Mozilla/<version> (<system-information>) <platform> (<platform-details>) <extensions>
以chrome 98版为例
Mozilla/<version> |
(<system-information>) |
<platform> |
(<platform-details>) |
<extensions> |
Mozilla/5.0 |
(Windows NT 10.0; Win64; x64) |
AppleWebKit/537.36 |
(KHTML, like Gecko) |
Chrome/98.0.4758.102 Safari/537.36 |
包含的信息
- 操作系统、硬件信息
- 浏览器名
- 浏览器版本
- 渲染引擎
- 渲染引擎版本
不可靠
User-Agen其实不可信,比如chrome 插件【User-Agent Switcher for Chrome】就可以随意更改。
Navigator
Navigator对象中包含了userAgent、userAgentData等信息,像上述的插件就没有去修改
{
...
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36"
userAgentData: NavigatorUAData
brands: Array(3)
0: {brand: ' Not A;Brand', version: '99'}
1: {brand: 'Chromium', version: '99'}
2: {brand: 'Google Chrome', version: '99'}
length: 3
[[Prototype]]: Array(0)
mobile: false
platform: "Windows"
[[Prototype]]: NavigatorUAData
vendor: "Google Inc."
vendorSub: ""
...
}
chrome
新版的谷歌浏览器会把部分ua信息放到请求头中,详情可见
https://browserleaks.com/client-hints,通过navigator.userAgentData也可以获取部分信息。
总结
这是一篇拖了很久得文,因为user-agent地位确实尴尬,说他有用吧,能被轻易地替换,说他不重要吧,我们用的也太多了。这段时间学习浏览器指纹,也有了些思路。例如user-agent包含的几个信息,有些信息是可以通过其他途径获取,再配合获取的user-agent,也可以用来判断用户的合法性。假如不同意,那大概率不是上面正常用户,比如puppeteer通过设置设备类型,可以轻易修改user-agent,但也仅仅修改了部分信息。例如:
- 系统
通过字体列表,基本可以确定设备系统类别。iOS,win,linux等系统默认的字体库特征明显了。
- 浏览器
- 通过部分特有的兼容性检测,可以将浏览器归类,甚至可以确定浏览器的大概版本。相反,如果检测代码被混淆加密,在代码未被突破的情况下还是比较难完美模拟的。
- 语音识别引擎,不同系统的不同浏览器特征还是很明显的。
- ja3指纹不错的检测方法,与系统和浏览器直接相关
- 渲染引擎
- 如果不禁用webGL,可以获取浏览器的渲染引擎。这让那个用chrome假装fireFox的我看起来那么的搞笑
参考
User-Agent