Specs 防盗链的遗漏:Referrer Policy
阅读(5843)背景
一般都是通过 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:
- 兼容性 https://www.caniuse.com/#search=Referrer-Policy
- redirect 丢失 referer https://coderwall.com/p/7a09ja/no-referer-after-redirect-solved
- 是否发送 referer 的详细举例 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#Examples
- meta 标签的 name 属性控制 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-name