您的位置首页  散文杂谈

检测代理服务器设置(流量走代理服务器是不是可以防检测)奔走相告

第三种,也是争议最大的一种客户端检测技术叫做用户代理检测。用户代理检测通过检测用户代理字符串来确定实际使用的浏览器。在每一次HTTP请求过程中,

检测代理服务器设置(流量走代理服务器是不是可以防检测)奔走相告

 

第三种,也是争议最大的一种客户端检测技术叫做用户代理检测用户代理检测通过检测用户代理字符串来确定实际使用的浏览器在每一次HTTP请求过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过JavaScript的navigator.userAgent属性访问。

在服务器端,通过检测用户代理字符串来确定用户使用的浏览器是一种常用而且广为接受的做法而在客户端,用户代理检测一般被当作一种万不得已才用的做法,其优先级排在能力检测和(或)怪癖检测之后提到与用户代理字符串有关的争议,就不得不提到电子欺骗(spoofing)。

所谓电子欺骗,就是指浏览器通过在自己的用户代理字符串加入一些错误或误导性信息,来达到欺骗服务器的目的要弄清楚这个问题的来龙去脉,必须从Web问世初期用户代理字符串的发展讲起 9.3.1 用户代理字符串的历史

HTTP规范(包括1.0和1.1版)明确规定,浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号RFC 2616(即HTTP 1.1协议规范)是这样描述用户代理字符串的:“产品标识符常用于通信应用程序标识自身,由软件名和版本组成。

使用产品标识符的大多数领域也允许列出作为应用程序主要部分的子产品,由空格分隔按照惯例,产品要按照相应的重要程度依次列出,以便标识应用程序”上述规范进一步规定,用户代理字符串应该以一组产品的形式给出,字符串格式为:标识符/产品版本号。

但是,现实中的用户代理字符串则绝没有如此简单1. 早期的浏览器1993年,美国NCSA(National Center for Supercomputing Applications,国家超级计算机中心)发布了世界上第一款Web浏览器Mosaic。

这款浏览器的用户代理字符串非常简单,类似如下所示Mosaic/0.9尽管这个字符串在不同操作系统和不同平台下会有所变化,但其基本格式还是简单明了的正斜杠前面的文本表示产品名称(有时候会出现NCSA Mosaic或其他类似字样),而斜杠后面的文本是产品的版本号。

Netscape Communications公司介入浏览器开发领域后,遂将自己产品的代号定名为Mozilla(Mosaic Killer的简写,意即Mosaic杀手)该公司第一个公开发行版,Netscape Navigator 2的用户代理字符串具有如下格式。

Mozilla/版本号 [语言] (平台; 加密类型)Netscape在坚持将产品名和版本号作为用户代理字符串开头的基础上,又在后面依次添加了下列信息语言:即语言代码,表示应用程序针对哪种语言设计平台:即操作系统和(或)平台,表示应用程序的运行环境。

加密类型:即安全加密的类型可能的值有U(128位加密)、I(40位加密)和N(未加密)典型的Netscape Navigator 2的用户代理字符串如下所示Mozilla/2.02 [fr] (WinNT; I)。

这个字符串表示浏览器是Netscape Navigator 2.02,为法语国家编译,运行在Windows NT平台下,加密类型为40位那个时候,通过用户代理字符串中的产品名称,至少还能够轻易地确定用户使用的是什么浏览器。

2. Netscape Navigator 3和Internet Explorer 31996年,Netscape Navigator 3发布,随即超越Mosaic成为当时最流行的Web浏览器而用户代理字符串只作了一些小的改变,删除了语言标记,同时允许添加操作系统或系统使用的CPU等可选信息。

于是,格式变成如下所示Mozilla/版本号 (平台; 加密类型 [; 操作系统或CPU说明])运行在Windows系统下的Netscape Navigator 3的用户代理字符串大致如下Mozilla/3.0 (Win95; U)。

这个字符串表示Netscape Navigator 3运行在Windows 95中,采用了128位加密技术可见,在Windows系统中,字符串中的操作系统或CPU说明被省略了Netscape Navigator 3发布后不久,微软也发布了其第一款赢得用户广泛认可的Web浏览器,即Internet Explorer 3。

由于Netscape浏览器在当时占绝对市场份额,许多服务器在提供网页之前都要专门检测该浏览器如果用户通过IE打不开相关网页,那么这个新生的浏览器很可能就会夭折于是,微软决定将IE的用户代理字符串修改成兼容Netscape的形式,结果如下:。

Mozilla/2.0 (compatible; MSIE 版本号; 操作系统)例如,Windows 95平台下的Internet Explorer 3.02带有如下用户代理字符串:Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)

由于当时的大多数浏览器嗅探程序只检测用户代理字符串中的产品名称部分,结果IE就成功地将自己标识为Mozilla,从而伪装成Netscape Navigator微软的这一做法招致了很多批评,因为它违反了浏览器标识的惯例。

更不规范的是,IE将真正的浏览器版本号插入到了字符串的中间字符串中另外一个有趣的地方是标识符Mozilla 2.0(而不是3.0)毕竟,当时的主流版本是3.0,改成3.0应该对微软更有利才对但真正的谜底到现在还没有揭开——但很可能只是人为疏忽所致。

3. Netscape Communicator 4和IE4~IE81997年8月,Netscapte Communicator 4发布(这一版将浏览器名字中的Navigator换成了Commu- nicator)。

Netscape继续遵循了第3版时的用户代理字符串格式:Mozilla/版本号 (平台; 加密类型 [; 操作系统或CPU说明])因此,Windows 98平台中第4版的用户代理字符串如下所示:Mozilla/4.0 (Win98; I)

Netscape在发布补丁时,子版本号也会相应提高,用户代理字符串如下面的4.79版所示:Mozilla/4.79 (Win98; I)但是,微软在发布Internet Explorer 4时,顺便将用户代理字符串修改成了如下格式:

Mozilla/4.0 (compatible; MSIE 版本号; 操作系统)换句话说,对于Windows 98中运行的IE4而言,其用户代理字符串为:Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)

经过此番修改,Mozilla版本号就与实际的IE版本号一致了,为识别它们的第四代浏览器提供了方便但令人遗憾的是,两者的一致性仅限于这一个版本在Internet Explorer 4.5发布时(只针对Macs),虽然Mozilla版本号还是4,但IE版本号则改成了如下所示:。

Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)此后,IE的版本一直到7都沿袭了这个模式:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

而IE8的用户代理字符串中添加了呈现引擎(Trident)的版本号:Mozilla/4.0 (compatible; MSIE 版本号; 操作系统; Trident/Trident版本号)例如:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)

这个新增的Trident记号是为了让开发人员知道IE8是不是在兼容模式下运行如果是,则MSIE的版本号会变成7,但Trident及版本号还会留在用户代码字符串中:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)。

增加这个记号有助于分辨浏览器到底是IE7(没有Trident记号),还是运行在兼容模式下的IE8IE9对字符串格式做了一点调整Mozilla版本号增加到了5.0,而Trident的版本号也升到了5.0IE9默认的用户代理字符串如下:。

Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)如果IE9运行在兼容模式下,字符串中的Mozilla版本号和MSIE版本号会恢复旧的值,但Trident的版本号仍然是5.0。

例如,下面就是IE9运行在IE7兼容模式下的用户代理字符串:Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0)所有这些变化都是为了确保过去的用户代理检测脚本能够继续发挥作用,同时还能给新脚本提供更丰富的信息。

4. GeckoGecko是Firefox的呈现引擎当初的Gecko是作为通用Mozilla浏览器的一部分开发的,而第一个采用Gecko引擎的浏览器是Netscape 6为Netscape 6编写的一份规范中规定了未来版本中用户代理字符串的构成。

这个新格式与4.x版本中相对简单的字符串相比,有着非常大的区别,如下所示:Mozilla/Mozilla版本号 (平台; 加密类型; 操作系统或CPU; 语言; 预先发行版本) Gecko/Gecko版本号 应用程序或产品/应用程序或产品版本号

这个明显复杂了很多的用户代理字符串中蕴含很多新想法下表列出了字符串中各项的用意字符串项必需吗说  明Mozilla版本号是Mozilla的版本号平台是浏览器运行的平台可能的值包括Windows、Mac和X11(指Unix的X窗口系统)加密类型是加密技术的类型:U表示128位、I表示40位、N表示未加密操作系统或CPU是浏览器运行的操作系统或计算机系统使用的CPU。

在Windows平台中,这一项指Windows的版本(如WinNT、Win95,等等)如果平台是Macintosh,这一项指CPU(针对PowerPC的68K、PPC,或MacIntel)如果平台是X11,这一项是Unix操作系统的名称,与使用Unix命令uname–sm得到的名称相同语言是浏览器设计时所针对的目标用户语言预先发行版本否最初用于表示Mozilla的预先发行版本,现在则用来表示Gecko呈现引擎的版本号Gecko版本号是Gecko呈现引擎的版本号,但由yyyymmdd格式的日期表示应用程序或产品否使用Gecko的产品名。

可能是Netscape、Firefox等应用程序或产品版本号否应用程序或产品的版本号;用于区分Mozilla版本号和Gecko版本号为了帮助读者更好地理解Gecko的用户代理字符串,下面我们来看几个从基于Gecko的浏览器中取得的字符串。

Windows XP下的Netscape 6.21:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1

Linux下的SeaMonkey 1.1a:Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1b2) Gecko/20060823 SeaMonkey/1.1a

Windows XP下的Firefox 2.0.0.11:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

Mac OS X下的Camino 1.5.1:Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1

以上这些用户代理字符串都取自基于Gecko的浏览器(只是版本有所不同)很多时候,检测特定的浏览器还不如搞清楚它是否基于Gecko更重要每个字符串中的Mozilla版本都是5.0,自从第一个基于Gecko的浏览器发布时修改成这个样子,至今就没有改变过;而且,看起来以后似乎也不会有什么变化。

随着Firefox 4发布,Mozilla简化了这个用户代理字符串主要改变包括以下几方面删除了“语言”记号(例如,前面例子中的“en-US”)在浏览器使用强加密(默认设置)时,不显示“加密类型”也就是说,Mozilla用户代理字符串中不会再出现“U”,而“I”和“N”还会照常出现。

“平台”记号从Windows用户代理字符串中删除了,“操作系统或CPU”中始终都包含“Windows”字符串“Gecko版本号”固定为“Gecko/20100101”最后,Firefox 4用户代理字符串变成了下面这个样子:。

Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox 4.0.15. WebKit2003年,Apple公司宣布要发布自己的Web浏览器,名字定为Safari。

Safari的呈现引擎叫WebKit,是Linux平台中Konqueror浏览器的呈现引擎KHTML的一个分支几年后,WebKit独立出来成为了一个开源项目,专注于呈现引擎的开发这款新浏览器和呈现引擎的开发人员也遇到了与Internet Explorer 3.0类似的问题:如何确保这款浏览器不被流行的站点拒之门外?答案就是向用户代理字符串中放入足够多的信息,以便站点能够信任它与其他流行的浏览器是兼容的。

于是,WebKit的用户代理字符串就具备了如下格式:Mozilla/5.0 (平台; 加密类型; 操作系统或CPU; 语言) AppleWebKit/AppleWebKit版本号 (KHTML, like Gecko) Safari/Safari版本号

以下就是一个示例:Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1

显然,这又是一个很长的用户代理字符串其中不仅包含了Apple WebKit的版本号,也包含了Safari的版本号出于兼容性的考虑,有关人员很快就决定了将Safari标识为Mozilla至今,基于WebKit的所有浏览器都将自己标识为Mozilla 5.0,与基于Gecko的浏览器完全一样。

但Safari的版本号则通常是浏览器的编译版本号,不一定与发布时的版本号对应换句话说,虽然Safari 1.25的用户代理字符串中包含数字125.1,但两者却不一一对应Safari预发行1.0版用户代理字符串中最耐人寻味,也是最饱受诟病的部分就是字符串"(KHTML,like Gecko)"。

Apple因此收到许多开发人员的反馈,他们认为这个字符串明显是在欺骗客户端和服务器,实际上是想让它们把Safari当成Gecko(好像光添加Mozilla/5.0还嫌不够)Apple的回应与微软在IE的用户代理字符串遭到责难时如出一辙:Safari与Mozilla兼容,因此网站不应该将Safari用户拒之门外,否则用户就会认为自己的浏览器不受支持。

到了Safari 3.0发布时,其用户代理字符串又稍微变长了一点下面这个新增的Version记号一直到现在都被用来标识Safari实际的版本号:Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.15.5 (KHTML, like 。

Gecko) Version/3.0.3Safari/522.15.5需要注意的是,这个变化只在Safari中有,在WebKit中没有换句话说,其他基于WebKit的浏览器可能没有这个变化一般来说,确定浏览器是否基于WebKit要比确定它是不是Safari更有价值,就像针对Gecko一样。

6. Konqueror与KDE Linux集成的Konqueror,是一款基于KHTML开源呈现引擎的浏览器尽管Konqueror只能在Linux中使用,但它也有数量可观的用户为确保最大限度的兼容性,Konqueror效仿IE选择了如下用户代理字符串格式:。

Mozilla/5.0 (compatible; Konqueror/ 版本号; 操作系统或CPU )不过,为了与WebKit的用户代理字符串的变化保持一致,Konqueror 3.2又有了变化,以如下格式将自己标识为KHTML:

Mozilla/5.0 (compatible; Konqueror/ 版本号; 操作系统或CPU) KHTML/ KHTML版本号 (like Gecko)下面是一个例子:Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.0 (like Gecko)

其中,Konqueror与KHTML的版本号比较一致,即使有差别也很小,例如Konqueror 3.5使用KHTML 3.5.17. Chrome谷歌公司的Chrome浏览器以WebKit作为呈现引擎,但使用了不同的JavaScript引擎。

在Chrome 0.2这个最初的 beta版中,用户代理字符串完全取自WebKit,只添加了一段表示Chrome版本号的信息,格式如下:Mozilla/5.0 ( 平台; 加密类型; 操作系统或CPU; 语言) AppleWebKit/AppleWebKit版本号 (KHTML,

like Gecko) Chrome/ Chrome版本号 Safari/ Safari版本Chrome 7的完整的用户代理字符串如下:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML,

like Gecko) Chrome/7.0.517.44 Safari/534.7其中,WebKit版本与Safari版本看起来似乎始终会保持一致,尽管没有十分的把握8. Opera仅就用户代理字符串而言,Opera应该是最有争议的一款浏览器了。

Opera默认的用户代理字符串是所有现代浏览器中最合理的——正确地标识了自身及其版本号在Opera 8.0之前,其用户代理字符串采用如下格式:Opera/ 版本号 (操作系统或CPU; 加密类型) [语言]

Windows XP中的Opera 7.54会显示下面的用户代理字符串:Opera/7.54 (Windows NT 5.1; U) [en]Opera 8发布后,用户代理字符串的“语言”部分被移到圆括号内,以便更好地与其他浏览器匹配,如下所示:

Opera/ 版本号 (操作系统或CPU; 加密类型; 语言)Windows XP中的Opera 8会显示下面的用户代理字符串:Opera/8.0 (Windows NT 5.1; U; en)默认情况下,Opera会以上面这种简单的格式返回一个用户代理字符串。

目前来看,Opera也是主要浏览器中唯一一个使用产品名和版本号来完全彻底地标识自身的浏览器可是,与其他浏览器一样,Opera在使用自己的用户代理字符串时也遇到了问题即使技术上正确,但因特网上仍然有不少浏览器嗅探代码,只钟情于报告Mozilla产品名的那些用户代理字符串。

另外还有相当数量的代码则只对IE或Gecko感兴趣Opera没有选择通过修改自身的用户代理字符串来迷惑嗅探代码,而是干脆选择通过修改自身的用户代理字符串将自身标识为一个完全不同的浏览器Opera 9以后,出现了两种修改用户代理字符串的方式。

一种方式是将自身标识为另外一个浏览器,如Firefox或者IE在这种方式下,用户代理字符串就如同Firefox或IE的用户代理字符串一样,只不过末尾追加了字符串Opera及Opera的版本号下面是一个例子:。

Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50

第一个字符串将Opera 9.5标识为Firefox 2,同时带有Opera版本信息第二个字符串将Opera 9.5标识为IE6,也包含了Opera版本信息这两个用户代理字符串可以通过针对Firefox或IE的大多数测试,不过还是为识别Opera留下了余地。

Opera标识自身的另一种方式,就是把自己装扮成Firefox或IE在这种隐瞒真实身份的情况下,用户代理字符串实际上与其他浏览器返回的相同——既没有Opera字样,也不包含Opera版本信息换句话说,在启用了身份隐瞒功能的情况下,无法将Opera和其他浏览器区别开来。

另外,由于Opera喜欢在不告知用户的情况下针对站点来设置用户代理字符串,因此问题就更复杂化了例如,打开My Yahoo!站点(http://my.yahoo.com)会自动导致Opera将自己装扮成Firefox。

如此一来,要想识别Opera就难上加难了在Opera 7以前的版本中,Opera会解析Windows操作系统字符串的含义例如,Windows NT 5.1实际上就是Windows XP,因此Opera会在用户代理字符串中包含Windows XP而非Windows NT 5.1。

为了与其他浏览器更兼容,Opera 7开始包含正式的操作系统版本,而非解析后的版本Opera 10对代理字符串进行了修改现在的格式是:Opera/9.80 (操作系统或CPU; 加密类型; 语言) Presto/Presto版本号 Version/版本号。

注意,初始的版本号Opera/9.80是固定不变的实际并没有Opera 9.8,但工程师们担心写得不好的浏览器嗅探脚本会将Opera/10.0错误的解释为Opera 1,而不是Opera 10因此,Opera 10又增加了Presto记号(Presto是Opera的呈现引擎)和Version记号,后者用以保存实际的版本号。

以下是Windows7中Opera 10.63的用户代理字符串:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.6.30 Version/10.639. iOS和Android

移动操作系统iOS和Android默认的浏览器都基于WebKit,而且都像它们的桌面版一样,共享相同的基本用户代理字符串格式iOS设备的基本格式如下:Mozilla/5.0 (平台; 加密类型; 操作系统或CPU like Mac OS X; 语言)。

AppleWebKit/AppleWebKit版本号 (KHTML, like Gecko) Version/浏览器版本号Mobile/移动版本号 Safari/Safari版本号注意用于辅助确定Mac操作系统的"like Mac OS X"和额外的Mobile记号。

一般来说,Mobile记号的版本号(移动版本号)没什么用,主要是用来确定WebKit是移动版,而非桌面版而平台则可能是"iPhone"、"iPod"或"iPad"例如:Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us)

AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16在iOS 3之前,用户代理字符串中不会出现操作系统版本号。

Android浏览器中的默认格式与iOS的格式相似,没有移动版本号(但有Mobile记号)例如:Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91)。

AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1这是Google Nexus One手机的用户代理字符串不过,其他Android设备的模式也一样。

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186