luckyyyyy / blog

William Chan's Blog
https://williamchan.me/
175 stars 28 forks source link

Referer & Referrer #6

Open luckyyyyy opened 7 years ago

luckyyyyy commented 7 years ago

Referer 头可以追溯到 HTTP 协议的起源,这可能是 HTTP 协议中第一个被拼写错误的标准头,

HTTP 规范是这样描述它的: ··· Referer[sic] 请求头字段允许由客户端指定资源的 URI 来自于哪一个请求地址,这对服务器有好处(应该是 “referrer” 这个字段拼错了)。Referer 请求头让服务器能够拿到请求资源的来源,可以用于分析用户的兴趣爱好、收集日志、优化缓存等等。同时也让服务器能够发现过时的和错误的链接并及时维护。 ···

尽管如此,其实它涉及到一些隐私泄露问题,例如在一个网盘中,你存放了一份重要的文档,网盘的url按照文件夹的path来变化,当你点击网盘中的其中一个外部链接后,外部网站的日志中就会记录你的referrer信息,即<prot://host:port/path>,这也是为什么腾讯等邮箱点击第三方链接后需要二次确认的原因之一,这其实也只是一个小把戏。

2014 年,W3C 的 Web 应用安全工作组(Web Application Security Working Group)发布了 Referrer Policy 草案,对浏览器该如何发送 Referrer 做了详细的规定。新版 Chrome 已经支持了这份草案,我们终于可以灵活地控制自己网站的 Referrer 策略了。

那么本文主要说明的是新的Referrer Policy

Referrer Policy

新的 Referrer Policy 指定了五种 Referrer 策略。

新的规则如下

其实之前就已经有三种策略,只不过在新的策略中他们改名了,他们分别是。

策略名字 属性值(新) 属性值(旧)
No Referrer no-referrer never
No Referrer When Downgrade no-referrer-when-downgrade default
Origin Only origin -
Origin When Cross-origin origin-when-cross-origin -
Unsafe URL unsafe-url always

可以看到,新标准给之前的三种策略赋予了更具意义的新名称,同时增加了两种新策略。 另外现阶段支持 Referrer Policy 的浏览器保留了对旧标准的支持,但还是推荐大家尽快更新。简单介绍下这五种类型的具体含义。

Referrer Policy Delivery

那么如何指定 Referrer Policy ?下面介绍三种方法,任选其中一种即可实现。

CSP 响应头

CSP(Content Security Policy),是一个跟页面内容安全有关的规范。在 HTTP 中通过响应头中的 Content-Security-Policy 字段来告诉浏览器当前页面要使用何种 CSP 策略。我之前写过一篇 Content Security Policy 介绍,可以先看看。现在 CSP 还可以通过 referrer 指令和五种可选的指令值,来指定 Referrer 策略,格式非常简单:

Content-Security-Policy: referrer no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|unsafe-url;

CSP 的指令和指令值之间以空格分割,多个指令之间用英文分号分割。

标签

通过 标签很简单,但是注意请放在head之间。

<meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|unsafe-url">

标签的 referrer 属性

它的作用域只有单个链接,而且目前支持并不理想,需要酌情考虑。