浅析HTTP的Referer含义理解、Referer作⽤(记录访问来源、防
盗链、防⽌恶意请。。。
HTTP 请求的头信息⾥⾯,Referer 是⼀个常见字段,提供访问来源的信息。很多开发者知道这个字段,但是说不清它的具体细节。本⽂详细介绍该字段。
⼀、Referer 的含义
现实⽣活中,购买服务或加⼊会员的时候,往往要求提供信息:"你从哪⾥知道了我们?",这叫做引荐⼈(referrer),谁引荐了你?对于公司来说,这是很有⽤的信息。互联⽹也是⼀样,你不会⽆缘⽆故访问⼀个⽹页,总是有⼈告诉你,可以去那⾥看看。服务器也想知道,你的"引荐⼈"是谁?
HTTP 协议在请求(request)的头信息⾥⾯,设计了⼀个 Referer 字段,给出"引荐⽹页"的 URL。
⽐如我从百度搜索关键字,然后跳转到我们⽹站,那么其 Referer 就是百度的搜索链接,百度链接⽐较长,带上了关键字之类的,如果是⾕歌的话,就只有⾕歌的⽹址,没有关键字那些。
这个字段是可选的。客户端发送请求的时候,可以⾃主决定是否加上该字段。
需要注意的是,这个字段的拼写是错的。Referer 的正确拼写是 Referrer,但是写⼊标准的时候,不知为何,没⼈发现少了⼀个字母 r。标准定案以后,只能将错就错,所有头信息的该字段都⼀律错误拼写成 Referer。
⼆、Referer 的常见作⽤
Referer 字段实际上告诉了服务器,⽤户在访问当前资源之前的位置,这往往可以⽤来⽤户跟踪。
1、⽤户⾏为⽇志记录访问来源:这个就不多说了。
2、另⼀个典型的应⽤是:防盗链
⽐如有些⽹站不允许图⽚外链,只有⾃家的⽹站才能显⽰图⽚,外部⽹站加载图⽚就会报错。它的实现就是基于Referer字段,如果该字段的⽹址是⾃家⽹址,就放⾏。
如何处理:将http请求发给服务器后,如果服务器要求必须是某个地址或者某⼏个地址才能访问,⽽你发送的referer不符合他的要求,就会拦截或者跳转到他要求的地址,然后再通过这个地址进⾏访问。
对于某些恶意⽤户,也可能伪造Referer来获得某些权限,在设计⽹站时要考虑到这个问题。⽐如做电⼦商务⽹站的安全,在提交信⽤卡等重要信息的页⾯⽤ referer 来判断上⼀页是不是⾃⼰的⽹站,如果
不是,可能是⿊客⽤⾃⼰写的⼀个表单来提交,为了能跳过你上⼀页⾥的 javascript 的验证等⽬的。但是注意不要把Rerferer⽤在⾝份验证或者其他⾮常重要的检查上,因为Rerferer⾮常容易在客户端被改变。
3、防⽌恶意请求
⽐如静态请求是.html结尾的,动态请求是.shtml,那么所有的*.shtml请求,必须 Referer为我⾃⼰的⽹站才可以访问,这就是Referer的作⽤。
4、由于涉及隐私,很多时候不适合发送Referer字段。
这⾥举两个例⼦,都不适合暴露 URL。⼀个是功能 URL,即有的 URL 不要登录,可以访问,就能直接完成密码重置、邮件退订等功能。另⼀个是内⽹ URL,不希望外部⽤户知道内⽹有这样的地址。Referer字段很可能把这些 URL 暴露出去。
此外,还有⼀种特殊情况,需要定制Referer字段。⽐如社交⽹站上,⽤户在对话中提到某个⽹址。这时,不希望暴露⽤户所在的原始⽹址,但是可以暴露社交⽹站的域名,让对⽅知道,是我贡献了你的流量。
(1)隐私:社交⽹站⼀般都会有⽤户个⼈页⾯,这些页⾯中⽤户都有可能添加⼀些外⽹的链接,⽽社
交⽹站有可能不希望在⽤户点击了这些链接的时候,泄露⽤户页⾯的 URL ,因为这些 URL 中可能包含⼀些敏感信息。当然,有些社交⽹站可能只想在 referer 中提供⼀个hostname,⽽不是完整的 URL 信息。
(2)安全:有些使⽤了 https 的⽹站,可能在 URL 中使⽤⼀个参数(sid 等)来作为⽤户⾝份凭证,⽽⼜需要引⼊其他 https ⽹站的资源,这种情况下,⽹站肯定不希望泄露⽤户的⾝份凭证信息。
三、rel 属性
由于上⼀节的原因,浏览器提供⼀系列⼿段,允许改变默认的 Referer ⾏为。对于⽤户来说,可以改变浏览器本⾝的全局设置,也可以安装浏览器扩展。这⾥就不详细介绍了。
对于开发者来说,rel="noreferrer" 属性是最简单的⼀种⽅法。<a>、<area>和<form>三个标签可以使⽤这个属性,⼀旦使⽤,该元素就不会发送Referer字段。
<a href="..." rel="noreferrer" target="_blank">xxx</a>
上⾯链接点击产⽣的 HTTP 请求,不会带有Referer字段。注意,rel="noreferrer" 采⽤的是正确的拼写。
四、Referrer Policy 的值及⽤法
1、什么是引⽤策略(Referrer Policy)?
引⽤策略就是从⼀个⽂档发出请求时,是否在请求头部定义 Referrer 的设置。
⽬前很多⽹站的防盗链机制都是⽤头部定义 Referrer 来判断是否是盗链。其实这个很容易破解,⾃⼰在请求时加上 Referrer 头部就⾏。
重定向过多是什么意思 在哪些情况下会设置引⽤头呢?⼀般来说,加载⼀个 HTML 页⾯之后,本 HTML 页⾯⾥的 JavaScript ⽂件,CSS ⽂件,画⾯⽂件都会设置 Referrer。然后,点击这个 HTML 页⾯⾥的链接,跳转其它画⾯时,也会设置 Referrer。
2、Referrer Policy 的 9 个取值:
rel 属性只能定制单个元素的Referer⾏为,⽽且选择⽐较少,只能发送或不发送。W3C 为此制定了更强⼤的。Referrer Policy 可以设定9个值。
(1)空字符串 - 默认值:⼀般浏览器的默认值是 no-referrer-when-downgrade
(2)no-referrer - 所有请求不发送 referrer。
(3)no-referrer-when-downgrade:当请求安全级别下降时不发送 referrer。⽬前,只有⼀种情况会发⽣安全级别下降,即从 HTTPS 到HTTP。HTTPS 到 HTTP 的资源引⽤和链接跳转都不会发送 referrer。
(4)same-origin:对于同源的链接和引⽤,会发送referrer,其他的不会。同源的意思是指同⼀个域名且同⼀协议。如果设置成 same-origin,那么 aaa 引⽤ bbb 的资源,不会发送 referrer。⼦域名也不是同⼀个域名,aaa 引⽤ test.aaa 的资源,不会发送referrer。
(5)origin:会发送 referrer,但只会发送源信息。源信息包括访问协议和域名。
(6)strict-origin:这个相当于 origin 和 no-referrer-when-downgrade 的 AND 合体。即在安全级别下降时不发送 referrer;安全级别未下降时发送源信息。
注意:这个是新加的标准,有些浏览器可能还不⽀持。
(7)origin-when-cross-origin:这个相当于 origin 和 same-origin 的 OR 合体。同源的链接和引⽤,会发送完全的 referrer 信息;但⾮同源链接和引⽤时,只发送源信息。
(8)strict-origin-when-cross-origin:这个⽐较复杂,同源的链接和引⽤,会发送 referrer。安全级别下降时不发送 referrer。其它情况下发送源信息。
注意:这个是新加的标准,有些浏览器可能还不⽀持。
(9)unsafe-url:⽆论是否发⽣协议降级,⽆论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松⽽最不安全的策略。
3、Referrer Policy 的设置⽅法:
(1)HTTP 头信息:服务器发送⽹页的时候,通过 http 响应头中的 Referrer-Policy 字段告诉浏览器
Content-Security-Policy: referrer no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|unsafe-url;
(2)<meta> 标签:也可以使⽤<meta>标签,在⽹页头部设置。
<meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-crossorigin|unsafe-url">
(3)referrerpolicy 属性:<a>、<area>、<img>、<iframe>和<link>标签,可以设置referrerpolicy 属性。
<a href="..." referrerpolicy="origin" target="_blank">xxx</a>
4、退出页⾯重定向
还有⼀种⽐较⽼式的技巧,但是⾮常有效,可以隐藏掉原始⽹址,⾕歌和 Facebook 都在使⽤这种⽅法。
链接的时候,不要直接跳转,⽽是通过⼀个重定向⽹址,就像下⾯这样。
<a href="/exit.php?url=http%3A%2F%2Fexample">Example</a>
上⾯⽹址中,先跳转到/exit.php,然后再跳转到⽬标⽹址。这时,Referer字段就不会包含原始⽹址。
五、空Referer是怎么回事
空Referer是指Referer头部的内容为空,或者,⼀个HTTP 请求头中根本不包含Referer,那么什么时候HTTP请求会不包含Referer字段呢?
根据Referer的定义,它的作⽤是指⽰⼀个请求是从哪⾥链接过来,那么当⼀个请求并不是由链接触发产⽣的,那么⾃然也就不需要指定这个请求的链接来源。
⽐如,直接在浏览器的地址栏中输⼊⼀个资源的URL地址,那么这种请求是不会包含Referer字段的,因为这是⼀个“凭空产⽣”的HTTP 请求,并不是从⼀个地⽅链接过去的。
那么在防盗链设置中,允许空Referer和不允许空Referer有什么区别?
允许Referer为空,意味着你允许⽐如浏览器直接访问,就是空。
拒绝空的 Referer ,⽐如我的www.sojson的静态资源都是拒绝空的Referer 的,那么当我访问我的⼀个图⽚时,就访问不了,直接报 403 拒绝访问。
最后我们了解⼀下哪些情况下⽆法获得上⼀页 referrer 信息:
(1)直接在浏览器地址栏中输⼊地址;
(2)使⽤ load() 刷新( location.href 或者 place() 刷新有信息);
(3)在对话框中,点击链接进⼊⾃⾝的浏览器;
(4)扫码进⼊QQ或者的浏览器;
(5)直接新窗⼝打开⼀个页⾯;
(6)a标签设置 rel="noreferrer"
(7)meta标签来控制不让浏览器发送referer;例如:<meta content="never" name="referrer">
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论