5

解析Navigator.userAgent的迷惑行为

 2 years ago
source link: https://juejin.cn/post/6908647211945590791
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

解析Navigator.userAgent的迷惑行为

2020年12月21日 10:00 ·  阅读 2792

首先,应该知道:

  1. userAgent是可以修改的,还有一些历史原因导致用该字段来识别浏览器某种程度上是不可靠的,但仔细观察可发现部分规律用作总括可用信息。
  2. 各大浏览器内核chorme/safari - blink/webkit IE - trident Firfox - gecko opera - presto/webkit/blink。

navigator.userAgent最初是有网景公司的Netscape Navigator流行后,后续浏览器跟随网景公司的格式进行模仿,例如,Netscape Navigator 3 发布不久,微软公布了它的首款 web 浏览器:IE3,但是Netscape是当时首选浏览器,大多数服务器在加载页面前都会检查userAgent是否为该款浏览器。IE如果不兼容Netscape userAgent字串,使用IE的用户就根本打不开这些页面,于是造就了如下格式: Mozilla/2.0 (compatible; MSIE 3.02; Windows 95) 结果就是IE摇身一变被识别成了Mozilla,伪装成Netscape Navigator,这就是如今大家查看大部分浏览器的userAgent字段中都会有“Mozilla/5.0”这样的字符。 后续浏览器在出世之后,为打开市场,学习IE,一路将userAgent带上了越来越相似的道路,难辨雌性。

navigator.userAgent格式

Mozilla/[version] ([system and browser information]) [platform] ([platform details]) [extensions]

  • Mozilla/[version]: 这个已经是兼容后的产物了,没什么意义了。一般为Mozilla/5.0。
  • ([system and browser information]): 系统与浏览器信息,如:(Macintosh; Intel Mac OS X 10_13_6)
  • [platform]: 浏览器渲染引擎,如:AppleWebKit/537.36
  • ([platform details]): 浏览器渲染其他补充信息,各个浏览器为了兼容,这个字段已经没有了实际意义,如(KHTML, like Gecko)。这个字段同样需要用括号括起来。
  • [extensions]: 扩展字段,个字段内容最为丰富,主要描述了浏览器信息,以及各个浏览器自己添加的自定义字段等。即 Chrome/70.0.3538.5 Safari/537.36。

注: 第二个字段设计的目地是描述浏览器信息,有些浏览器并没有按照这样的规定执行,所以,在后面的扩展字段中会记录浏览器信息。

  • Mozilla/[version]

设计时描述的是浏览器名/版本,但在历史中,各大浏览器为了相互兼容,该字段只剩下历史意义,一般值为Mozilla/5.0, Mozilla/4.0, Opera/9.80(opera当初有规矩过)

  • 系统和浏览器信息

这个括号里的字段没什么规律,唯一规律就是以分号分隔开 以下userAgent截取到第二个字段来分析下:

// windows
// IE 系列
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.1; Trident/7.0; rv:11.0)
Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; KB974489; Maxthon 2.0)
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; WOW64; Trident/5.0; Maxthon 2.0)

// edge
Mozilla/5.0 (Windows NT 6.1; WOW64)
Mozilla/5.0 (Windows NT 10.0; Win64; x64)

// firefox
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0)
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0)

// chrome
Mozilla/5.0 (Windows NT 10.0; Win64; x64)
    
// Mac
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3)
    
// Linux
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:18.0)
Mozilla/5.0 (X11; Linux i586; rv:31.0)
    
// iOS
Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)
Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X)
Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us)
    
// Android
Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; NexusOneBuild/FRF91)
    
// 其他设备
Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en)
Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US)
复制代码
字段对应系统
compatible/windowswindows
Macintoshmac PC
X11/linuxlinux
iPhone/iPad/iPodios移动端
Android安卓

其他字段: Windows NT x.x

字段对应版本
MSIE 6.0; Windows NT 5.1IE6
MSIE 7.0; Windows NT 6.0IE7
MSIE 8.0; WindowsNT 6.0; Trident/4.0IE8
MSIE 9.0; Windows NT 6.1; Trident/5.0IE9
MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0IE10
MSIE 11, Windows NT 6.1; Trident/7.0; rv:11.0IE11
  • 浏览器渲染引擎

一般可以大致区分出不同的内核,如下:

AppleWebKit/537.36(KHTML, like Gecko)  // 一般为chrome/safari浏览器, 内核为webkit/blink
Gecko/20100101     // 一般为firefox浏览器, 内核为gecko
Presto/2.8.131     // 旧版opera浏览器, 内核为presto
like Gecko        // IE11开始写这个,实际意义不大
复制代码

扩展字段采用空格进行分隔,包含的信息比较重要,主流字段有:

Chrome:Chrome/版本号

Safari:Safari/版本号 (历史原因,chrome浏览器后面也会带safari字段)

Version:Version/版本号 系统版本号

Mobile:移动设备标识,一般指内部版本号,苹果设备会带版本号,安卓设备不含版本号

还可以包含其他浏览器字段,主要是各种第三方浏览器,APP内嵌的H5页等, 为了是自我识别,加上的APP独有的信息,这样就有助于区分端,一般来讲采用的是kay/value形式。

常用浏览器userAgent

  • Chrome浏览器
Chrome/73.0 - Win10:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36

Chrome 17.0 – MAC
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11
复制代码
  • Safari浏览器
safari 5.1 – Windows
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

safari 5.1 – MAC
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
复制代码
  • Firefox浏览器
firefox 6.0 - Win7:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0

firefox 4.0.1 – MAC
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
复制代码
  • Opera浏览器
Opera 11.11 – Windows
User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11

Opera 11.11 – MAC
User-Agent:Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11
复制代码
  • IE浏览器
IE 11
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
IE 9.0
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;
IE 8.0
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)
IE 7.0
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)
IE 6.0
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

WinXP+ie8:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)
WinXP+ie7:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
WinXP+ie6:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
复制代码
  • 遨游浏览器
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)
复制代码
  • 搜狗浏览器
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)
复制代码
  • 360浏览器
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)
复制代码
  • 360极速浏览器
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 QIHU 360EE
复制代码
  • QQ浏览器
pc
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)

mobile
MQQBrowser/26Mozilla/5.0 (Linux;U;Android2.3.7;zh-cn;MB200Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1(KHTML,likeGecko) Version/4.0 Mobile Safari/533.1
复制代码
  • Android
Mozilla/5.0 (Linux;U;Android2.3.7;en-us;NexusOneBuild/FRF91) AppleWebKit/533.1(KHTML,likeGecko) Version/4.0 Mobile Safari/533.1
复制代码
  • iPhone
Mozilla/5.0 (iPhone;U;CPUiPhoneOS4_3_3likeMacOSX;en-us) AppleWebKit/533.17.9(KHTML,likeGecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
复制代码
Mozilla/5.0 (iPad;U;CPUOS4_3_3likeMacOSX;en-us) AppleWebKit/533.17.9(KHTML,likeGecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5
复制代码

通过userAgent可获取相关信息

  1. 从环境上区分
环境字段匹配版本号(osVersion)
移动端-AndroidandroidAndroid([\d.]+)
移动端-iPhoneiPhoneiPhoneOS([\d_]+)
移动端-iPadiPadOS([\d_]+)
pc-浏览器Chrome/Safari/Firefox/Opera/Windows NT/Maxthon/TencentTraveler/360SE/QIHU 360EE/MicroMessenger等--
mobile-浏览器MQQBrowser/
  1. 从平台上区分
平台匹配标识备注
WindowsWindows NT 5.1/Windows NT 6.0/Windows NT 6.0等详细分析型号需要加上Trident
MACMacintosh
Linuxx11; linux ppc/ppc64/i6886等
平台匹配标识备注
AndroidAndroid3.3.3
iPhoneiPhoneOS4_3_3
iPadiPad OS4_3_3

PS:userAgent没有统一固定的格式,只能总结出一般规律,想要获取有关信息,需要事先知道想要的信息是什么样的,再正则匹配出。

若有错误,欢迎指正~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK