双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

图片防盗链的实现竟然如此简单?

几何心凉 CSDN会员 几何心凉 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

前言

防盗链,就是防有人盗用你的链接。别人在他的网站上引用了你的资源(图片,音频),这样就会浪费你的流量,资源被引用的多了起来,你这边的服务器可能就扛不住挂了,你说这是多么悲哀的事情!

一般情况下以图片防盗链居多,我们也来看看图片防盗链是如何做出来的。

的声卡是否

图片防盗链

先来看个图,这个图是我在本地启了一个服务后,分别加载了百度和360搜索两个网站的图片链接,对应防盗链下的样子(说好的美少女呢)

 

 

 

百度的做法是用另外一张图片替换了,而360搜索的做法更粗暴,直接出现了裂图,访问403直接给Forbidden了。

这就是所谓的图片防盗链了,毕竟看到这样的图,大家也没了兴致,和之前想要的图片差距太大,也就没必要再保留了

那么关键部分来了,图片防盗链是如何做到的呢?且看下图

 

 

 

图中所示,在请求头中有Host(请求的主机)和Referer(来源)两个参数,之所以会形成防盗链,那是因为Host和referer所对应的值不相同造成的。

下面我们就直接来实践一下,做一个图片防盗链,上菜;

 

 

 

 

该图为整个文件夹目录结构,下面参考该目录结构来做,继续来撸。

 


 
  1. // js部分

  2. const fs = require('fs');

  3. const path = require('path');

  4. const http = require('http');

  5. const url = require('url');

  6. const getHostName = function (str) {

  7. let { hostname } = url.parse(str);

  8. return hostname;

  9. };

  10.  

  11. http.createServer((req, res) => {

  12. let refer = req.headers['referer'] || req.headers['referrer']; // 请求头都是小写的

  13. // 先看一下refer的值,去和host的值作对比,不相等就需要防盗链了

  14. // 要读取文件 返回给客户端

  15. let { pathname } = url.parse(req.url);

  16. let src = path.join(__dirname, 'public', '.' + pathname);

  17. // src代表我要找的文件

  18.  

  19. fs.stat(src, err => { // 先判断文件存不存在

  20. if (!err) {

  21. if (refer) { // 不是所有图片都有来源

  22. let referHost = getHostName(refer);

  23. let host = req.headers['host'].split(':')[0];

  24.  

  25. if (referHost !== host) {

  26. // 防盗链

  27. fs.createReadStream(path.join(__dirname, 'public', './1.jpg')).pipe(res);

  28. } else {

  29. // 正常显示,如果路径存在,可以正常显示直接返回

  30. fs.createReadStream(src).pipe(res);

  31. }

  32. } else {

  33. // 正常显示,如果路径存在,可以正常显示直接返回

  34. fs.createReadStream(src).pipe(res);

  35. }

  36. } else {

  37. res.end('end');

  38. }

  39. });

  40.  

  41. }).listen(8888);

  42.  

通过以上不到40行的代码就完成了图片防盗链,想来也并没有辣么麻烦,利用请求头来做的事情还是蛮多的,先来看看防盗链的效果吧


 
  1. <-- html部分 -->

  2. <body>

  3. <img src="http://www.chenhd.me:8888/2.png" />

  4. </body>

  5.  

这里我们修改一下hosts文件,把127.0.0.1指定为两个不同的域名访问

  1. 127.0.0.1 www.chenhd.me

  2. 127.0.0.1 www.chd.me

友情提示:

  • windows系统修改hosts文件地址为C:\Windos\System32\drivers\etc下的hosts文件,拷贝hosts文件修改后替换即可

  • mac系统下较为方便通过终端直接sudo vi /etc/hosts修改即可

由于html部分我们图片引用的地址就是www.chenhd.me域名下的图片,所以这种情况属于正常访问,直接展示2.png图片了,就是这么酷

 

 

 

当修改域名为www.chd.me的时候,再次访问就发现已经替换为防盗链图片1.jpg了,看如下效果

 

 

 

以上内容就实现了如何做一个图片防盗链,防止别人使用你的资源,当然不仅仅是图片防盗链,音频,视频等也可以根据此方法实现,之后大家也可以在工作中尝试尝试。

 

原文:https://juejin.im/post/5adc0d03518825673a2022b7

...全文

相关推荐

php实现图片文件与下载文件防盗链的方法

本文实例讲述了php实现图片文件与下载文件防盗链的方法。分享给大家供大家参考。具体分析如下: 在php中最简单的防盗链办法就是利用php的$_SERVER[‘HTTP_REFERER’]函数来操作了,但是此方法不可靠,我们最终还是需要使用apache,iis来进行操作的,具体的操作方法如下: php防盗链: 复制代码 代码如下:&lt;?php session_start(); session_register(‘check’); $_SESSION[‘check’]=true; ?&gt; 检查session变数,判断是否造访首页。并且检查他的来源网页参考(HTTP_REFERER)是否来自本地网站的网

weixin_38683930

简单的防盗链功能代码(iframe)

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

weixin_38738977

php简单防盗链验证实现方法 <font color=red>原创</font>

主要介绍了php简单防盗链验证实现方法,通过$_SERVER['HTTP_REFERER']获取来路页面URL再进行判断进而实现对非本地URL的拦截功能,需要的朋友可以参考下

weixin_38630091

ASP.NET 图片防盗链的实现原理分析

那么我来介绍下图片放盗链的一个方法 首先,添加个httpHandlers请求,WEBCONFIG部分配置节如下: <httpHandlers> <add verb=”*” path=”*.jpg” type=”myhandler,App_Code”/> </httpHandlers> 注意:对应于system.web之下,别添错了哦! 然后添加个class,取名为myhandler继承于IHttpHandler class原型如下: 代码如下: using System; using System.Data; using System.Configuration; using System.

weixin_38681218

用Asp隐藏文件路径,实现防盗链 的代码

用Asp隐藏文件路径,实现防盗链 的代码

weixin_38686080
评论 5
收藏 已收藏
分享
返回顶部
几何心凉 CSDN会员
几何心凉 2022年度博客之星前端领域TOP 1 2022年度博客之星前端领域TOP 1领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
前端社区 316,891 成员 60,460 内容