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

一、Referer的含义

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

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

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

这里特别注意: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

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

如下图:

或者用<a>、<area>、<img>、<iframe>、<script>、<link>元素上的referrerpolicy属性为其设置独立的请求策略。如下图:

<script src='/javascripts/test.js' referrerpolicy="no-referrer"></script>

未加link元素的referrerpolicy属性会出现下图所示:

四、防盗链

1.防盗链的工作原理

通过referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以追踪到显示它的网页地址,一旦检测到来源不是本站,即进行阻止或者返回指定的页面。

2.如何绕过图片防盗链

现在很多网站是如何利用Referer来进行防图片盗链的呢?

其实是有三种情况下允许引用图片:

  • 本网站
  • 无Referer信息情况。(服务器认为是从浏览器直接访问的图片URL,所以这种情况下是能正常访问)
  • 授权的网址

通常情况下我们只能从情况2入手,通过设置Referer为空进行绕过防盗链。

(1)利用https网站盗链http资源网站,referer不会发送

先利用openssl生成自签名证书(可以参考这个https://github.com/zxl925768661/Blog/tree/main/HTTP%E7%9B%B8%E5%85%B3/Demos/referer/demo03) )

只适用于旧版本的浏览器,https降为http 是一种非常不安全的行为,该操作浏览器会自动禁止。虽然降级失败但是可以成功访问/src/img/1.jpg.因为referer为空且白名单命中了192.168.0.103:8080 字段。
whiteList.indexof(referHostName) == 1 ,返回了正确的图

设置meta

<meta name="referrer" content="no-referrer" /> 

(2)利用iframe伪造请求Referer

可以参考(如何绕开referrer防盗链 - 掘金)这个网址

结果如下:

(3)利用XMLHTTPRequest

XMLHttpRequest中setRequestHeader方法,用于请求头添加或修改字段。

// 通过ajax下载图片
function loadImage(uri) {return new Promise(resolve => {let xhr = new XMLHttpRequest();xhr.responseType = "blob";xhr.onload = function() {resolve(xhr.response);};xhr.open("GET", uri, true);// 通过setRequestHeader设置header不会生效// 会提示 Refused to set unsafe header "Referer"xhr.setRequestHeader("Referer", ""); xhr.send();});
}// 将下载下来的二进制大对象数据转换成base64,然后展示在页面上
function handleBlob(blob) {let reader = new FileReader();reader.onload = function(evt) {let img = document.createElement('img');img.src = evt.target.result;document.getElementById('container').appendChild(img)};reader.readAsDataURL(blob);
}const imgSrc = "https://tiebapic.baidu.com/forum/w%3D580%3B/sign=f88eb0f2cf82b9013dadc33b43b6ab77/562c11dfa9ec8a135455cc35b203918fa1ecc09c.jpg";loadImage(imgSrc).then(blob => {handleBlob(blob);
});

上述代码运行时会发现控制台提示错误:

Refused to set unsafe header "Referer"

可以看见setRequestHeader设置referer响应头是无效的,这是由于浏览器为了安全起见,无法手动设置部分保留字段,不幸的是Referer恰好就是保留字段之一。

Referer的理解及防盗链相关推荐

  1. php破解referer防盗链解析,Referer原理与图片防盗链实现方法详解

    本文实例讲述了Referer原理与图片防盗链实现方法.分享给大家供大家参考,具体如下: 1.图片防盗链 在一些大型网站中,比如百度贴吧,该站点的图片采用了防盗链的规则,以至于使用下面代码会发生错误. ...

  2. 使用HttpServletRequest对象的getHeader(“referer”)方法实现下载资源防盗链的功能

    请编写一个类,该类使用HttpServletRequest对象的getHeader("referer")方法实现下载资源防盗链的功能 在实际开发中,经常会使用referer头字段, ...

  3. HTTP Referer(页面统计/资源防盗链)

    简介 HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理.比如从我主 ...

  4. 获取referer中的请求参数_javaweb之request获取referer请求头实现防盗链

    在开发web程序的时候,有时我们需要得到用户是从什么页面连过来的,这就用到了referer. 它是http协议,所以任何能开发web程序的语言都可以实现,比如jsp中是: request.getHea ...

  5. 【JavaWeb开发】Referer防盗链的详解

    1. 什么是Referer? Referer 是 HTTP 请求(requset) header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里就有包含 Refere ...

  6. js修改referer 解决图片防盗链问题

    最近在项目中遇到了一个问题就是项目中需要显示其他网站上的图片,网上找了好多,但是没有一个具体的代码策略,我在这里给大家提供一个方案. 先说说防盗链的原理,http 协议中,如果从一个网页跳到另一个网页 ...

  7. 服务器作防盗链图片中转,Node.js 上手项目简明教程

    文/李信栋 前几天随手写的 chrome 插件遇到了防盗链问题,由于插件不能用 js iframe 的方法反防盗链,于是想用服务器做个中转.记录一下上手项目的各个点,以后再用 nodejs 就不用到处 ...

  8. Nginx(七)防盗链

    一   基本铺垫 盗链的理解 ①  什么是盗链 盗链就是'盗用'别的网站的'链接'1)'大佬'建一个网站,'提供下载'以提高自己知名度和吸引力,这样你就必须有'空间存储'那些供人们下载的资源2)'不劳 ...

  9. springboot使用阿里云oss教程,oss使用+安全访问(防盗链、防盗刷、流量控制)

    文章目录 一.基本使用 ① 引入依赖 ② application.yml 添加访问oss需要的参数 ③ 编写oss工具类 ④ 编写controller ⑤ 访问文件? 安全使用 ①防止资源盗用--防盗 ...

最新文章

  1. 贾扬清感谢信:阿里开源10年,致敬千万开源人
  2. Hibernate通用Dao实现
  3. poj 1734 (最小环)
  4. Linux软件 github,Linux下使用GitHub记
  5. Python3 GUI:PyQt5环境搭建
  6. MPLS_×××入门中文版
  7. IMS与未来电信产业演变
  8. HDU 4540 威威猫系列故事——打地鼠(DP)
  9. 时间序列数据的多元回归_清理和理解多元时间序列数据
  10. 如何扩大C盘的大小(电脑c盘太小的解决办法,分区助手V8.8操作步骤)
  11. OpenStack 企业私有云的若干需求(7):电信行业解决方案 NFV
  12. MySql字段内容加密与解密
  13. 引文信件和地址的写法!
  14. 图解SQL SERVER 2008R2安装与配置
  15. Ubuntu13.04下让宏碁Aspire4750G屏幕亮度可调节
  16. 上行NOMA和下行NOMA(解码顺序)
  17. Kotlin笔记30--顶层方法
  18. ChemDraw绘制苯甲酸钠的生成反应式的方法
  19. 计算机c盘哪些文件不能删,Win7下C盘哪些文件可以删除?
  20. 4412开发板学习之Linux驱动开发(八):GPIO读操作与按键轮询实现

热门文章

  1. LINUX手动释放内存
  2. 小度音箱如何连接智汀中不同品牌的设备?
  3. 数学家高斯的问题,一个有意思的小算法,根据高斯整数计算日期
  4. 【Python安装-保姆级教程】马哥手把手教你安装Python并配置pycharm环境
  5. 券商区块链的“钱途”
  6. 常见的HR SaaS系统都有哪几种类型?
  7. java 8 lambda sort_java8新特性:Lambda表达式ArrayList排序
  8. cmd 设置环境变量
  9. 组策略方式关闭445端口
  10. 为何单片机程序不用加载到RAM