跳转到内容

用户代理

本页使用了标题或全文手工转换
维基百科,自由的百科全书

用户代理(英语:user agent)在电脑科学中指的是代表用户行为的程序(软件代理程序英语Software agent)。例如,网页浏览器就是一个“帮助用户获取、渲染网页内容并与之交互”的用户代理;电邮阅读器也可以称作邮件代理。而在会话发起协议(SIP)中,用户代理指代的是一个通信会话的所有两个终端[1]

在很多场合,用户代理作为一个主从式架构的分布式计算系统中的通信所用网络传输协议客户端而行为。特别是在超文本传输协议中指定要求发起请求的客户端软件要使用一个“User-Agent”请求表头,即使在客户端不由用户操纵的时候。SIP协议(基于HTTP)沿用了这一用法。

用户代理识别

[编辑]

当一个软件在一个网络协议进行操作时,它通常向它的operating peer提交一个特定的字符串来标示自己,该字符串通常包含了其应用程式类型、操作系统、软件供应商……等等,有时还会包含软件修订版本等资讯。在HTTP、SIP以及SMTP/NNTP[2]协议中,这个识别是通过user-agent头字段传送的。
网络机器人,例如网络抓取工具,通常也会在用户代理的字符串中包含bot的操纵者的连络资讯,例如一个URL或一个电邮地址,以便网站管理员可以用来连络操纵者。

在HTTP中,User-Agent字符串通常被用于内容协商,而原始伺服器为该响应选择适当的内容或操作参数。例如,User-Agent字符串可能被网络伺服器用以基于特定版本的客户端软件的已知功能选择适当的变体。

通过使用robots.txt文件的可以设置网络抓取工具对网站的部分访问与否,而其设置标准之一就是用户代理字符串。换句话说,借由robots.txt文件的设置,可以让网站不能被特定的浏览器访问。

可能隐私问题

[编辑]

与许多其它HTTP请求标头一样,在User-Agent字符串内的资讯构成了客户端发送给伺服器的资讯的一部分,由于该字符串可以因用户不同而有很大程度的差异。[3]

格式

[编辑]

根据Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content.页面存档备份,存于互联网档案馆)第5.5.3章和Hypertext Transfer Protocol -- HTTP/1.1页面存档备份,存于互联网档案馆)第14.43章,用户代理的格式如下:

  • User-Agent = product *( RWS ( product / comment ) )

例如你的产品叫做WikiBrowser,你的用户代理字符串就可能是WikiBrowser/1.0 Gecko/1.0。“最重要的”产品组件被最先列出。这个字符串的部分如下所示:

字符串 说明
WikiBrowser/1.0 产品名称和版本
Gecko/1.0 排版引擎和版本。

但不幸的是,在浏览器大战期间,很多网络伺服器的配置只给被识别为某些版本的Mozilla的客户端发送需要高级功能的网页。

因此,为获取更好的网页,绝大多数网页浏览器使用的User-Agent值如下:

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

例如,iPad上的Safari使用的就是下述:

Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405

这个字符串的组成如下:

字符串 说明
Mozilla/5.0 Mozilla/5.0 是一个通用标记符号,用来表示与 Mozilla 兼容,这几乎是现代网页浏览器的标配。[4]
(iPad; U; CPU OS 3_2_1 like Mac OS X; en-us) 浏览器所运行的系统的详细资讯(iPad,类似 Mac OS X,使用美式英语)
AppleWebKit/531.21.10 浏览器所使用的平台(平台为Webkit浏览器引擎)
(KHTML, like Gecko) 浏览器平台的细节(使用 KHTML渲染引擎,一种类似Gecko的渲染引擎)
Mobile/7B405 被浏览器用于指示特定的直接由浏览器提供或者通过第三方提供的可用的增强功能。这方面的一个实例是Microsoft Live Meeting,它注册了一个扩展以使Live Meeting服务知道该软件是否已经安装上,这意味着它可以为加入会议提供一个简化的体验。

网页浏览器用户代理字符串的演变历史

[编辑]

现时网页浏览器用户代理字符串的复杂性,源于网页浏览器历代更新和竞争下的结果:

最早出现的网页浏览器是伊利诺伊大学国家超级计算中心(NCSA)的Mosaic,使用的用户代理字符串类似为:NCSA_Mosaic/2.0 (Windows 3.1)

网景通讯公司招募了Mosaic的主要开发人员,开发出新的网页浏览器以挑战取代Mosaic,其开发代号为Mozilla,意为“Mosaic杀手(Mosaic Killa)”,由于避免与Mosaic产生著作权纠纷,最终产品名为Netscape Navigator(网景导航者),使用的用户代理字符串类似为:Mozilla/1.0 (Win3.1)。网景导航者引入了大量新的先进HTML语言特性,包括框架(frame),当时的网页伺服器已经使用用户代理嗅探机制,用户代理字符串包含“Mozilla”的会提供更先进的页面。

之后微软也开发出Internet Explorer意图挑战取代Netscape Navigator,同样实现了Netscape Navigator所拥有的先进特性,但由于伺服器的用户代理嗅探机制,为了尽快跟随对手,所以使用了包含“Mozilla”的用户代理字符串,类似为:Mozilla/1.22 (compatible; MSIE 2.0; Windows 95),同样获得伺服器提供先进的页面。最终在第一次浏览器大战中,Netscape Navigator的领先地位被Internet Explorer取代。

后来网景将Netscape Navigator开源化,诞生出Mozilla组织,开发出新的开源浏览器渲染引擎Gecko及对应的浏览器产品Mozilla FireFox,以在第二次浏览器大战中挑战Internet Explorer的地位,使用的用户代理字符串类似于:Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826。与此同时,源于Linux的开发软件项目KDE开发出Konqueror以及其浏览器渲染引擎KHTML,为了能通过用户代理嗅探(包含“Gecko”的则提供相应的先进页面特性),使用了跟随Mozilla和Gecko的用户代理字符串,类似为:Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)。之后基于KHTML派生的网页浏览器都跟随KHTML用户代理字符串的基础上附加自己的独特资讯,以保证伺服器通过用户代理嗅探提供获得对应渲染引擎所实现的先进页面特性,例如苹果公司开发的源于KHTML的渲染引擎Webkit及产品Safari,使用的是:Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5Google开发的基于Webkit的产品ChromeChromium及派生的渲染引擎Blink,使用的是:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

特例的是,Opera同时使用标识兼容于多个渲染引擎(或网页浏览器)和自己独有渲染引擎Presto的用户代理字符串,类似于: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51Opera/9.60 (Windows NT 6.0; U; en) Presto/2.1.1,并且允许用户选择使用的用户代理字符串。Opera在放弃使用Presto而改用Blink后,兼容性的用户代理字符串则跟随KHTML系列的写法。

用户代理欺骗

[编辑]

各种网页浏览器的流行程度在整个Web的历史上一直在变化,而且有些网站不是根据万维网联盟(W3C)或者互联网工程任务组(IETF)所制定的统一标准的方式设计,而是设计只能在特定浏览器下显示。网站通常探测浏览器版本的代码,根据用户代理调整其页面设计。换句话说,在流行程度不高的浏览器上,即使它们可能有能力处理它,不会收到较复杂的内容,更甚者,在极端情况下,拒绝全部内容[5]。因此,有很多浏览器有伪装或欺骗其标识字符串的功能,让伺服器发送不同的内容。例如,Android上的浏览器识别自己为Safari以增加兼容性。[6]

其它HTTP客户端程序,如下载管理器离线网页浏览器,通常有能力更改用户代理字符串。

垃圾邮件机器人网络爬虫经常使用假的用户代理。

在网页设计师中流行“任何浏览器可见”[7],鼓励开发者设计网页时,能让网页在任何浏览器都能有一样好的浏览结果。

用户代理欺骗的结果之一是可能令收集到的网页浏览器的使用分布不准确。需要注意,用户代理欺骗可能违反某些法律法规、损害他人利益[8]

用户代理嗅探

[编辑]

用户代理嗅探(User Agent sniffing)指的是网站在特定用户代理下查看时展示不同内容的技术。在互联网上,这将导致在特定浏览器下浏览某些网页时显示的是截然不同的站点。这方面一个有用的例子是Microsoft Exchange Server 2003的Outlook Web Access功能。当在Internet Explorer 6(或更新版本)查看时,比起在任何更旧浏览器中的相同页面,会有更多功能被显示,因为旧的浏览器无法渲染相同内容[来源请求]。用户代理嗅探大多被认为是不好的做法,因为它鼓励浏览器特定的设计而且由于无法识别的用户代理标识而惩罚新的浏览器。相反,W3C推荐创建标准的HTML标记,[9]允许在尽可能多的浏览器下正确的渲染,且测试特定的浏览器特性而不是特定浏览器版本或品牌。[10]

专门针对手机的Web站点,如NTT DOCOMOi-mode或者沃达丰Vodafone live!英语Vodafone live!门户网站,通常严重依赖于用户代理嗅探,由于移动浏览器通常相互之间差异巨大。在最近几年中,[何时?]在移动浏览领域已作出了很多发展,然而很多并不拥有这些新技术的旧的手机仍然在被广泛使用。所以,手机门户网站经常依赖用以浏览它们的手机种类而产生而产生截然不同的标记代码。这些差异可以很小,如,调整某些图像的大小以适应更小的屏幕,或者相当大,如,以WML渲染网页而不是XHTML

加密强度表示法

[编辑]

在美国创建的网页浏览器,如Netscape NavigatorInternet Explorer,在用户代理字符串中使用字母U, I和N以指定加密强度。直至1996年,美国政府允许了通过长于40位密钥的加密被出口为止,供应商推出不同浏览器版本,各自具有不同加密强度。“U”代表美国(为具有128-位加密的版本);“I”代表国际—浏览器具有40-位加密且可以在全世界任何地方被使用—而“N”代表(事实上)“没有”(没有加密)。[11]随着出口限制的解除,绝大多数供应商支持了256-位加密。

参见

[编辑]

参考

[编辑]
  1. ^ RFC 3261, SIP: Session Initiation Protocol, IETF, The Internet Society (2002)
  2. ^ Netnews Article Format. IETF. November 2009: sec. 3.2.13. RFC 5536. 
  3. ^ Peter Eckersley. "Browser Versions Carry 10.5 Bits of Identifying Information on Average页面存档备份,存于互联网档案馆)", Electronic Frontier Foundation, 27 January 2010. Retrieved 25 August 2011.
  4. ^ User-Agent. Mozilla 开发者网络. [2018-01-09]. (原始内容存档于2021-04-23) (中文(中国大陆)). 
  5. ^ Burstein complaining "... I've been rejected until I come back with Netscape". [2012-05-04]. (原始内容存档于2018-09-08). 
  6. ^ 存档副本. [2011-08-09]. (原始内容存档于2011-08-06). 
  7. ^ "Viewable with Any Browser" campaign. [2012-05-04]. (原始内容存档于2018-09-08). 
  8. ^ 乐视浏览器有意更改UA被判构成不正当竞争. 人民网. 中国知识产权报. [2017-10-17]. (原始内容存档于2017-10-17). 
  9. ^ Pemberton, Stephen. W3C Markup Validation Service. W3C. [2011-10-18]. (原始内容存档于2022-01-05). 
  10. ^ Clary, Bob. Browser Detection and Cross Browser Support. Mozilla Developer Center. Mozilla. 10 February 2003 [2009-05-30]. (原始内容存档于2011-11-17). 
  11. ^ Zawinski, Jamie. user-agent strings (obsolete). mozilla.org. 1998-03-28 [2010-01-08]. (原始内容存档于2011-10-04). 

外部链接

[编辑]