使用Referer Meta标签控制referer

转载:来自FreeBuf黑客与极客(FreeBuf.COM)html

本文描述了一个关于 http 协议中 referer 的 metadata 参数的提议,使用这个 metadata 参数,html 文档能够控制 http 请求中的 referer ,好比是否发送 referer、只发送 hostname 仍是发送完整的 referer 等。虽然有一些方法能够控制 referer ,好比 flash,以及一些 js 的 tricks,可是本文中描述的是另一番景象。浏览器

使用场景

在某些状况下,出于一些缘由,网站想要控制页面发送给 server 的 referer 信息的状况下,可使用这一 referer metadata 参数。安全

隐私

社交网站通常都会有用户我的页面,这些页面中用户都有可能添加一些外网的连接,而社交网站有可能不但愿在用户点击了这些连接的时候,泄露用户页面的 URL ,由于这些 URL 中可能包含一些敏感信息。固然,有些社交网站可能只想在 referer 中提供一个 hostname,而不是完整的 URL 信息。网站

安全

有些使用了 https 的网站,可能在 URL 中使用一个参数(sid 等)来做为用户身份凭证,而又须要引入其余 https 网站的资源,这种状况下,网站确定不但愿泄露用户的身份凭证信息。url

Object-Capability Disciplinecode

有些网站遵循Object-Capability Discipline,而 referer 恰好与这一策略相悖,因此,网站可以控制 refeer 将对 Object-Capability Discipline 颇有利。server

技术细节

referer 的 metedata 参数能够设置为如下几种类型的值:htm

  • never
  • always
  • origin
  • default

若是在文档中插入 meta 标签,而且 name 属性的值为 referer,浏览器客户端将按照以下步骤处理这个标签:ip

  • 1.若是 meta 标签中没有 content 属性,则终止下面全部操做
  • 2.将 content 的值复制给 referrer-policy ,并转换为小写
  • 3.检查 content 的值是否为上面 list 中的一个,若是不是,则将值置为 default

上述步骤以后,浏览器后续发起 http 请求的时候,会按照 content 的值,作出以下反应(下面 referer-policy 的值即 meta 标签中 content 的值):ci

  • 1.若是 referer-policy 的值为never:删除 http head 中的 referer;
  • 2.若是 referer-policy 的值为default:若是当前页面使用的是 https 协议,而正要加载的资源使用的是普通的 http 协议,则将 http header 中的 referer 置为空;
  • 3.若是 referer-policy 的值为 origin:只发送 origin 部分;
  • 4.若是 referer-policy 的值为 always:不改变http header 中的 referer 的值,注意:这种状况下,若是当前页面使用了 https 协议,而要加载的资源使用的是 http 协议,加载资源的请求头中也会携带 referer。 例子

若是页面中包含了以下 meta 标签,全部从当前页面中发起的请求将不会携带 referer:

<meta name="referrer" content="never">

若是页面中包含了以下 meta 标签,则从当前页面中发起的 http请求将只携带 origin 部分(注:根据原文中的语境,我理解这里的 origin 是包含了 schema 和 hostname 的部分 url,不包含 path 等后面的其余 url 部分),而不是完整的 URL :

<meta name="referrer" content="origin">

注意:在使用本文中所述的 meta 标签的时候,浏览器原有的 referer 策略将被打破,好比从 http 协议的页面跳转到 https 的页面的时候,若是设置了适当的值,也会携带 referer。

其余问题

这与 rel=noreferer 有什么关系呢?可能 rel=noreferer 会覆盖掉本文中的 meta 标签所设置的值。也就是功能覆盖。 origin 信息不是一个完整的 url,因此浏览器客户端估计会在 origin 后面加一个 / 来做为 path 部分。 若是 origin 是惟一的,会发生什么状况呢?估计 referer 会被忽略。

译者注

这篇文章最初写于2012年,目前在原始页面已是废弃状态,而且已经提供了w3c 的referer-policy 页面,可是,译者注意到,目前不少网站在防护 CSRF 的时候,都采用校验 referer 的方法,有时候容许 referer 为空,而且某些 BAT 厂商的重要业务在防护 JSON 劫持的时候,也采用校验 referer 的方法并容许 referer 为空,也许你会以为本文中描述的只是一种提议,可是,FireFox 在21日的一篇文章中已经声明,从 Firefox 36 Beta 开始,将会支持 referer-policy,这无疑会让一些厂商的业务面临威胁。

[参考来源wiki.whatwg.org,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)]

相关文章
相关标签/搜索