防盗链referer详解和解决办法「建议收藏」

防盗链referer详解和解决办法「建议收藏」防盗链原理:http标准协议中有专门的字段记录referer1、他可以追溯到请求时从哪个网站链接过来的。2、来对于资源文件,可以跟踪到包含显示他的网页地址是什么。因此所有防盗链方法都是基于这个Referer字段1.事情经过在一开始,我打算将其他网站(如:爱奇艺,腾讯)的图片放在自己的网站(http://localhost…)上显示.<imgsrc=”http://pic6…

大家好,又见面了,我是你们的朋友全栈君。

防盗链原理:

http标准协议中有专门的字段记录referer
1、他可以追溯到请求时从哪个网站链接过来的。
   //小例子
     这个头信息指示所指向的 Web 页的 URL。例如,如果您在网页 1,点击一个链接到网页 2,
    当浏览器请求网页 2 时,网页 1 的 URL 就会包含在 Referer 头信息中。
2、来对于资源文件,可以跟踪到包含显示他的网页地址是什么。

因此很多防盗链方法都是基于这个Referer字段

//而User-Agent 是判断爬虫和浏览器的一个原因
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
 'Referer': 'http://****'

一、事情经过

在一开始,我打算将其他网站的图片放在自己的网站(http://localhost…)上显示.

<img src="http://pic6.iqiyipic.com/image/20200215/f6/f9/a_100280816_m_601_m2.jpg"/>

结果却是返回403 Forbidden (即:没有权限访问此站),无法在自己的网站上加载出图片.

然后我以为是链接失效了,然后我复制该链接到浏览器上直接访问,发现可以正常加载图片,
还有在本地(file://…)打开也能正常显示图片.
然后我就纳闷了,为什么同一个html文件(都是加载同一条链接).
我使用(http协议)打开,就返回403,我本地打开(file协议)就可以返回正常图片,
我想src链接是一样的,那肯定是两种请求方式(http和file)的不同让他们的服务器识别了,
针对不同的请求返回不同的结果(其实是通过Referer字段识别的)

二、寻找原因
然后为了查看两种请求方式的不同,我就自己写了一个node服务器(其实直接在浏览器上查看请求头的也是可以的,不过我是找到原因以后才知道的)

var express = require('express');  //引入express模块
var app = express();  //创建express的实例
app.get('/app', function(req, res){ 
   
	console.log(req.headers);   //打印请求头
    res.send('Hello,myServer'); //服务器响应请求
});
app.listen(3000,function(){ 
      //监听3000端口
    console.log("Server running at 3000 port");
});

写了一个客户端(html代码省略)

<script type="text/javascript">
 $(function () { 
     
			 $.ajax({ 
   
                url: "http://localhost:3000/app",   //请求业务数据
                type: "GET",
                success: function (result) { 
   
				  console.log(result+'3000');
                }
            });
			
        });
</script>

(在本地直接打开会显示跨域,不要紧,因为请求(这里指简单请求,简单请求和复杂请求的区别)
已经发出去了,不管有没有跨域浏览器都会发送请求,然后浏览器通过接受到返回结果发现请求头没有
‘Access-Control-Allow-Origin’ ‘*’ 才显示跨域的,也就是说数据发过来了,浏览器就是不给你显示)
本地打开(file:///)显示结果
在这里插入图片描述
而借助nginx打开的(http://)

        url: "http://localhost/app",   //将url请求路径修改
       #nginx.config配置转发路径(这样就不会显示跨域了,还能将结果返回浏览器)
       location /app {
            proxy_pass http://192.168.0.103:3000;  #转发地址
		}		

结果
在这里插入图片描述

从上面两幅图就可以看出,本地请求没有referer请求字段,而http请求却有
然后查阅得知:正是referer起到了防盗链的作用。防止其他网站加载他的的图片

三、解决方法

因为浏览器限制,不能手动添加和修改referer请求头
所以只利用nginx来转发请求,并重新设置referer字段

 location /* {
            proxy_set_header referer  '';  #设置为空,或者该请求路径允许的referer字段路径
            proxy_pass http://........;  #转发地址
		}	

四、新增方法
js使用iframe跳过防盗链

<script type="text/javascript"> 
function showImg( url ) { 
var frameid = 'frameimg' + Math.random(); 
//使用window(全局对象)来声明,全局对象的属性也是全局变量
window.imgWindow = '<img id="imgId" src=\''+url+'?'+Math.random()+'\' /><script>window.onload = function() { parent.document.getElementById(\''+frameid+'\').height = document.getElementById(\'imgId\').height+\'px\'; }<'+'/script>'; 
document.write('<iframe id="'+frameid+'" src="javascript:parent.imgWindow;" frameBorder="0" scrolling="no" width="100%"></iframe>'); 
} 
</script> 
//调用
<script type="text/javascript">showImg('图片地址');</script>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163487.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VMware虚拟机怎么卸载_虚拟机系统进入安全模式

    VMware虚拟机怎么卸载_虚拟机系统进入安全模式vmware是一款主流的虚拟机软件,很多小伙伴都会在电脑上安装这款虚拟机软件,方便用户在里面模拟出多台虚拟机。如果不想用了要如何卸载呢?下面就来看看详细的卸载教程。在应用管理界面软件列表中找到VMware,点击【卸载】按钮即可。在桌面左下角win图标上右键鼠标点击【设置】按钮。在打开的Windows设置面板中点击【应用】选项。…

    2022年8月31日
    3
  • AI能够为能源企业带来巨大回报——却为何未得到采用?[通俗易懂]

    AI能够为能源企业带来巨大回报——却为何未得到采用?

    2022年3月5日
    36
  • 粒子群优化算法的实现方式_matlab粒子群优化算法

    粒子群优化算法的实现方式_matlab粒子群优化算法粒子群优化算法实现容易、精度高、收敛快,在解决实际问题中展示了其优越性。文章目录1算法基本概念2算法的MATLAB实现3粒子群算法的权重控制4混合粒子群算法参考文献1算法基本概念粒子群优化算法属于进化算法的一种,通过追随当前搜索到的最优值来寻找全局最优。粒子群算法也称粒子群优化算法(ParticleSwarmOptimization,PSO),PSO有几个关键概念:粒子、优化函数、适值(FitnessValue)、飞行方向、飞行距离。2算法的MATLAB实现3粒子群算法的权重控

    2022年10月11日
    2
  • 从日记到博客

    从日记到博客我自零八年上大学开始主动写日记,记录一些自己的想法。我特别喜欢在纸上写字的感觉。我会在纸上记录一些想法和反思,自己新见识的事物、经历,与人接触的小摩擦,待人接物的新想法,也有自己的情感的。当看看最初的日记的时候,觉得当时的想法还非常的幼稚。后来经历的一些事情给我很多困惑、苦恼、启发、激励,帮我建立对人、对事的态度和认知。如果不是这些文字,过去的我是什么样子,会有什么样的想法,早就完全忘记了。正是这…

    2022年5月18日
    34
  • linux系统如何修改用户名_两种方案对比报告

    linux系统如何修改用户名_两种方案对比报告在安装系统的时候,经常会无意识的随便起个用户名,后面如果发现该用户名不好或因为环境需要须重起个用户名,经过查找资料和亲自测试发现有两种方案可选:手动修改和使用usermod等命令自动修改。方案一:手动修改各个关联用户文件以root身份登录系统文件的修改需要root权限,这里不管是原root用户登录还是普通用户切换到root下都可以,只要有修改权限就行。修改/etc/passwd这个文件中的用户名部

    2022年9月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号