HTML教程7:谈谈User-Agent的伪造
1、伪造不可耻
User-Agent是可以伪造的,甚至浏览器开发商支持这种伪造。以Opera为例,它公开宣传:“我们应该让用户来决定他们想让我们伪装成哪个浏览器”。甚至,Opera干脆创建了菜单项让用户自主选择让Opera浏览器变成什么样子的User-Agent。
其实,User-Agent的开头格式:Mozilla/x.x
,本身就是起源于伪造。这里面有个故事:
新秀网景浏览器Netscape Navigator
支持框架Frame,当时框架已经变得流行起来,但是前辈Mosaic
浏览器不支持框架,于是网站管理员探测User Agent,对网景浏览器发送含有框架的页面,对非网景浏览器发送没有框架的页面。
备注:网景浏览器的User Agent为Mozilla。
此后微软开发了自己的浏览器(基于Mosaic
浏览器),这就是Internet Explorer
,并希望它可以成为Netscape Killer。IE同样支持框架,但它不是Mozilla,所以它总是收不到含有框架的页面。微软很郁闷很快就沉不住气了,它不想等到所有的网站管理员都了解IE并且给IE发送含有框架的页面,它选择宣布IE是兼容Mozilla,并且模仿Netscape称IE为“Mozilla/x.xx(compatible; MSIE x.x; Windows 95)”,于是IE可以收到含有框架的页面了,所有微软的人都嗨皮了,但是网站管理员开始晕了。
因为微软将IE和Windows捆绑销售,并且把IE做得比Netscape更好,于是第一次浏览器血腥大战爆发了,结果是Netscape Navigator以失败退出历史舞台。但没想到Netscape Navigator居然以Mozilla的名义重生了,并且开发了Gecko内核,这次它自称为“Mozilla/x.xx(Windows; U; Windows NT x.x; ) Gecko/xxxx”。
Gecko是一款渲染引擎并且很出色,Firefox基于此内核,并自称“Mozilla/x.xx (Windows; U; Windows NT x.x;) Gecko/xxxx Firefox/x.x”。
Gecko性能很出色,它开始攻城略地,其他新的浏览器使用了它的代码,并且将自己称为“Mozilla/x.x (Macintosh; U; PPC Mac OS X Mach-O;) Gecko/xxxx Camino/x.x”,以及“Mozilla/x.x (Windows; U; Windows NT x.x;) Gecko/xxxx SeaMonkey/x.x”,每一个都将自己装作Mozilla,而它们全都使用Gecko。
Gecko很出色,而IE完全跟不上它,因此User Agent探测规则变了,使用Gecko的浏览器被发送了更好的代码,而其他浏览器则没有这种待遇。Linux的追随者对此很难过,因为他们的引擎是KHTML,他们认为KHTML和Gecko一样出色,但却因为不是Gecko而得不到好的页面,于是为得到更好的页面开始将自己伪装成“like Gecko”,并自称为“Mozilla/x.x (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)”。自此User Agent变得更加混乱。
后来苹果开发了Safari浏览器,并使用KHTML作为渲染引擎,但苹果加入了许多新的特性,于是苹果从KHTML另辟分支称之为WebKit,但它又不想抛弃那些为KHTML编写的页面,于是Safari自称为“Mozilla/x.x (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/x.x (KHTML, like Gecko) Safari/x.x”,这进一步加剧了User Agent的混乱局面。
再后来,谷歌开发了Chrome浏览器,Chrome使用Webkit作为渲染引擎,和Safari之前一样,它想要那些为Safari编写的页面,于是它伪装成了Safari。于是Chrome使用WebKit,并将自己伪装成Safari,WebKit伪装成KHTML,KHTML伪装成Gecko,最后所有的浏览器都伪装成了Mozilla,这就是为什么所有的浏览器User-Agent里都有Mozilla。Chrome自称为“Mozilla/x.x (Windows; U; Windows NT x.x; en-US) AppleWebKit/x.x (KHTML, like Gecko) Chrome/x.x Safari/x.x”。
2、User-Agent通常格式
Chrome浏览器的市场占有率很高,我们用Chrome浏览器查看User-Agent的结果:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36
User-Agent通常格式:Mozilla/5.0 (平台) 引擎版本 浏览器版本号
第一部分:Mozilla/5.0
由于历史上的浏览器大战,当时想获得图文并茂的网页,就必须宣称自己是 Mozilla 浏览器。此事导致如今User-Agent里通常都带有Mozilla字样,出于对历史的尊重,大家都会默认填写该部分。
第二部分:平台部分可由多个字符串组成,用英文半角分号分开
Windows NT 10.0是指使用的操作系统的版本,如果使用的Win10对应的就是Windows NT 10.0,如果使用Win7对应的就是Windows NT 6.1。Win64; x64是指操作系统是64位的
Windows系统下:
Windows NT 5.0 // 如 Windows 2000
Windows NT 5.1 // 如 Windows XP
Windows NT 6.0 // 如 Windows Vista
Windows NT 6.1 // 如 Windows 7
Windows NT 6.2 // 如 Windows 8
Windows NT 6.3 // 如 Windows 8.1
Windows NT 10.0 // 如 Windows 10
macOS系统下:
Macintosh; Intel Mac OS X 10_9_0 // Intel x86 或者 x86_64
Macintosh; PPC Mac OS X 10_9_0 // PowerPC
Macintosh; Intel Mac OS X 10.12; // 不用下划线,用点
第三部分:引擎版本
AppleWebKit/537.36 (KHTML, like Gecko)...Safari/537.36,各种引擎之间的关系更混乱了:
历史上,苹果依靠了WebKit内核开发出Safari浏览器,WebKit包含了WebCore引擎,而WebCore又从KHTML衍生而来。由于历史原因,KHTML引擎需要声明自己是“类似Gecko”的,因此引擎部分这么写:AppleWebKit/537.36 (KHTML, like Gecko)...Safari/537.36,
再后来,Google开发Chrome也是用了WebKit内核,于是也跟着这么写。
借用Littern的一句话:“Chrome 希望能得到为Safari编写的网页,于是决定装成Safari,Safari使用了WebKit渲染引擎,而WebKit呢,又伪装自己是KHTML,KHTML呢,又是伪装成Gecko的。同时所有的浏览器又都宣称自己是Mozilla。”。
不过,后来Chrome 28某个版本改用了blink内核,但还是保留了这些字符串。而且,最近的几十个版本中,这部分已经固定,没再变过
第四部分:浏览器版本
此时用的是Chrome浏览器,其中60.0 是大版本,3100是持续增大的一个数字,而0则是修补漏洞的小版本。