Referer的理解及防盗链

        HTTP请求的头信息里面,Referer是一个常见字段,提供访问来源的信息。很多开发者知道这个字段,但是说不清它的具有细节。本文详细介绍该字段。

一、Referer的含义

        现实生活中,购买服务或加入会员的时候,往往要求提供信息:“你是从哪里知道的我们?”,这叫做引荐人(referer),谁引荐了你?对公司来说很,这是很有用的信息。互联网也是一样,你不会无缘无故访问一个网页,总会有人告诉你,可以去那里看看。服务器也想知道,你的“引荐人”是谁?

        HTTP协议在请求(request)的头部信息里,设计了一个Referer字段,给出“引荐网页”的URL。

        比如说我们在谷歌浏览器上,从百度搜索关键字,然后跳转到我们搜索的网站,那么它的Referer就是百度的搜索链接。百度链接比较长,待上课关键之类的。如下图:

Referer的理解及防盗链_第1张图片

这里特别注意:Referer请求头可能会暴露用户的浏览历史、涉及到用户的隐私问题。

 二、Referrer-policy的值及用法

Referrer-policy可以一定程度上防御csrf漏洞

        目前很多网站的防盗链机制都是用头部定义Referrer来判断是都盗链。其实这个很容易破解,自己在请求时加上Referrer头部就行。

        在哪些情况下会设置引用头呢?一般来说,加载一个HTML页面之后,本HTML页面里面的JavaScript文件,CSS文件,画面文件都会设置Referrer。然后,点击这个HTML页面里的链接,跳转其他页面时,也会设置Referrer。

Referrer-policy的8个值:

  • no-referrer:整个referer首部会被移除,访问来源信息不随着请求一起发送。通俗易懂的来说就是所有请求不发送Referrer。
  • no-referrer-when-downgrade:在没有指定任意策略的情况下用户代理的默认行为。在同等级安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送(HTTPS->HTTP)。
  • origin:任意情况下,仅发送文件的源作为引用地址。源信息包括访问协议和域名。例如:https://example.com/page.html会将https://example.com/作为引用地址。
  • origin-when-cross-origin:对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。
  • same-origin:对于同源的请求会发送引用地址,但是对于非同源请求则不会发送引用地址信息。例如:如果设置成same-origin,那么aaa.com引用bbb.com的资源,就不会发送Referrer。

这里同源的意思是指同一个域名且同一协议。

  • strict-origin:再同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送(HTTPS->HTTP)。
  • strict-origin-when-cross-origin:对于同源的请求,会发送完整的URL作为引用地址;再同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部(HTTPS->HTTP)。
  • unsafe-url:无论是同源请求还是非同源请求,都发送完整的URL(移除参数信息之后)作为引用地址。(最不安全)。

三、Referer的设置

1.在HTML里设置meta

如下图:

Referer的理解及防盗链_第2张图片

 或者用