Specs 防盗链的遗漏:Referrer Policy

阅读(5704)

背景

一般都是通过 HTTP referer 的值来判断对资源的请求来源是否合法,同时为防误判会允许 referer 为空的情况,这就是遗漏。

有些情况会丢失 HTTP referer:

  • 直接访问图片,无 referer;
  • https 页面访问 http 资源不会有 referer;
  • 部分浏览器在 redirect 时会丢失 referer (meta refresh, location.href)。

Referrer Policy

Referrer Policy 定义了浏览器对 referer 是否发送的处理方式,有如下取值:

  • no-referrer :不发送 referer。
  • origin :仅发送 origin 部分(协议://域名:端口/)。
  • no-referrer-when-downgrade :默认值,https 之间的请求会发送,但 https 页面内的 http 请求不会发送。
  • origin-when-crossorigin :同源发送完整 url(含查询参数),非同源仅发送 origin 部分。
  • unsafe-url :发送完整URL(含查询参数),不区分是否同源。

可以通过两种方式生效:

  • 服务器端输出 HTTP header: Referrer-Policy
  • HTML页面的 <meta> 标签声明

提醒下:除了 HTTP协议中 referer 的错误拼写根源,后续规范都已经做了更正为 referrer, 如 HTTP Referrer-Policy、Javascript 中的 document.referrer.

浏览器兼容性

虽然 W3C Referrer Policy 仍然是候选稿,但已然是实际中的执行标准了。现代浏览器基本都支持此特性了,可以用 Referrer Policy 绕开防盗链的限制,兼容度比较高的是使用老版本的取值定义:

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

主流浏览器兼容性如下:

  • 直到IE 11都不支持此特性
  • Edge 支持此属性的老版本:never, always, origin & default values
  • Safari 也是到 11 为止,支持的是老版本的 referrer-policy
  • iOS 上的浏览器,支持的是老版本的 referrer-policy
  • UC Android 不支持

Refer:

  1. 兼容性 https://www.caniuse.com/#search=Referrer-Policy
  2. redirect 丢失 referer https://coderwall.com/p/7a09ja/no-referer-after-redirect-solved
  3. 是否发送 referer 的详细举例 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#Examples
  4. meta 标签的 name 属性控制 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-name
Tags: referrer