Referer的理解及防盗链

这篇具有很好参考价值的文章主要介绍了Referer的理解及防盗链。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、Referer的含义

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

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

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

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">

如下图:

Referer的理解及防盗链

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

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

Referer的理解及防盗链

 Referer的理解及防盗链

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

Referer的理解及防盗链

四、防盗链

 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) )

Referer的理解及防盗链

 Referer的理解及防盗链

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

Referer的理解及防盗链

设置meta

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

 (2)利用iframe伪造请求Referer

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

Referer的理解及防盗链

 Referer的理解及防盗链

 结果如下:

Referer的理解及防盗链

(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恰好就是保留字段之一。文章来源地址https://www.toymoban.com/news/detail-412122.html

到了这里,关于Referer的理解及防盗链的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c# .net mvc的IHttpHandler奇妙之旅--图片文件请求安全过滤,图片防盗链

    源码下载: c# .net mvc图片文件请求安全过滤,图片防盗链 https://download.csdn.net/download/cplvfx/88206428 在阅读该文章前,请先阅读该文章 c# .net mvc的IHttpHandler奇妙之旅。.net的生命周期和管道你听说过吗?你可以利用他处理业务如:跳转业务页面,文件请求的安全过滤,等等,还有许

    2024年02月13日
    浏览(32)
  • 编写一个JSP登录页面,可输入用户名和密码,提交请求到另一个JSP页面,该JSP页面获取请求的相关数据并显示出来。请求的相关数据包括用户输入的请求数据和请求本身的一些信息。

    实战要求 : 编写一个JSP登录页面,可输入用户名和密码,提交请求到另一个JSP页面,该JSP页面获取请求的相关数据并显示出来。请求的相关数据包括用户输入的请求数据和请求本身的一些信息。 (例如请求使用的协议getProtocol()、请求的URI request.getServletPath()、请求方法requ

    2024年02月06日
    浏览(45)
  • 【BUG】Message = “无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。“, StackTrace = “ 在 System.Reflection.

    环境: C#项目遇到这种情况时,是因为有多个依赖出了问题(也可能是只有一个但被误报成多个),此时点开“查看详细信息”,可以快速监视Exception: 查看 System.Exception ,即可定位是哪个包出问题。 上面的问题[0]和[1]都是: 对于这个问题,请参考该篇博客的 第四步 :.NET项

    2024年02月15日
    浏览(45)
  • java里面封装https请求工具类

    2024年02月10日
    浏览(37)
  • 怎么在unity里面打开一个项目

    还是希望自己快乐吧,因为没有人需要我,所以不想继续下去。 现在开始学习unity吧,学习新的东西,就会花费更多时间,就不会再想了。 学习学习,我爱学习 当下载完成之后,我们先来尝试打开一个项目吧,有两种方法,自己新建一个或者去找这里官方给的项目,也可以

    2024年02月05日
    浏览(47)
  • 用python获取一个网页里面表格的数据

    比如我想要这个网址  https://zh.wikipedia.org/zh-cn/ISO_3166-1 下的国际地区代码列表  第一步F12查看这个部分的结构。结构如下 是一个tabletrtd py代码如下 返回的结构是这样的 下面网址是国际电话区号列表 https://zh.wikivoyage.org/zh-cn/%E5%9B%BD%E9%99%85%E7%94%B5%E8%AF%9D%E5%8C%BA%E5%8F%B7%E5%88%97%

    2024年02月13日
    浏览(67)
  • 【Java】一个关于装箱的某里面试题

    题目:  求这个代码的输出结果。 答案: 第一个为true,第二个为false. 我们来看一下这个题,我们这里发生了装箱操作,所以我们得知道装箱过程是什么样的,我们来看一下反编译: 我们可以看到底层其实是调用了valueOf()这个方法,那我们去Integer类中找一下这个方法: 那也

    2024年02月14日
    浏览(49)
  • Python合并一个 Excel 里面的多张表

    刚需要将入职五个月的日报汇总, 但是每日都是在通一个excel里面新建副表写日报,现在已经积累了84张附表(每周4张,总共21周),手动复制粘贴每张表格是相当耗时的工作。在这个时候,我开始思考:有没有一种更快捷的方法来合并这些表格呢?于是,我想到了使用Python。

    2024年02月05日
    浏览(42)
  • 在vm虚拟机里面创建一个操作系统用户

    以下代码在xshell下面运行,远程创建。 这里我创建的是一个用户名为 dada 的用户 远程登陆普通用户后,需要切换到root用户 [redhat@localhost ~]$ su - root  输入密码后进入root用户,接下来就是创建操作系统用户了 [root@localhost ~]# 进入root用户后输入以下命令: vim /etc/passwd 按 i 键,编

    2024年02月05日
    浏览(77)
  • 从一个word里面复制表格到另一个word时,表格变形的问题

    复制过来保留源格式,检查段落、页边距里面的格式都和原始word一致后,仍然表格变形。 这时点页边距-自定义页边距-文档网格 看字符数是不是一致的

    2024年03月10日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包