QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2025|回复: 0

[HTML/CSS/JS] 图片防盗链的实现既然如此简单

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-9-28 08:32:01 | 显示全部楼层 |阅读模式
       防盗链就是防有人盗用你的链接。别人在他的网站上引用了你的资源(图片,音频),这样就会浪费你的流量,资源被引用的多了起来,你这边的服务器可能就扛不住挂了,你说这是多么悲哀的事情!一般情况下以图片防盗链居多,我们也来看看图片防盗链是如何做出来的。
+ @. _. u5 W: A( z       先来看个图,这个图是我在本地启了一个服务后,分别加载了百度和360搜索两个网站的图片链接,对应防盗链下的样子。6 @* r4 c2 Y6 U
1.jpg 0 i9 q! ?- c+ |2 ^/ S
       百度的做法是用另外一张图片替换了,而360搜索的做法更粗暴,直接出现了裂图,访问403直接给Forbidden了。这就是所谓的图片防盗链了,毕竟看到这样的图,大家也没了兴致,和之前想要的图片差距太大,也就没必要再保留了。那么关键部分来了,图片防盗链是如何做到的呢?且看下图:
( Q, y6 L- ]6 \4 E& n$ L% [ 2.jpg
% A* R) A4 c  b9 j       图中所示,在请求头中有Host(请求的主机)和Referer(来源)两个参数,之所以会形成防盗链,那是因为Host和referer所对应的值不相同造成的。下面我们就直接来实践一下,做一个图片防盗链。1 [7 v9 F  g6 \
3.jpg
" W- x6 ~2 v. s" Q* P+ f       该图为整个文件夹目录结构,下面参考该目录结构来做,继续来撸。, G6 ^% q2 B1 ~8 G- {- S; n% |1 q& B
  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. http.createServer((req, res) => {
  11.     let refer = req.headers['referer'] || req.headers['referrer'];  // 请求头都是小写的
  12.     // 先看一下refer的值,去和host的值作对比,不相等就需要防盗链了  
  13.     // 要读取文件 返回给客户端
  14.     let { pathname } = url.parse(req.url);
  15.     let src = path.join(__dirname, 'public', '.' + pathname);
  16.     // src代表我要找的文件
  17.    
  18.     fs.stat(src, err => {   // 先判断文件存不存在
  19.         if (!err) {
  20.             if (refer) {    // 不是所有图片都有来源
  21.                 let referHost = getHostName(refer);
  22.                 let host = req.headers['host'].split(':')[0];
  23.                
  24.                 if (referHost !== host) {
  25.                     // 防盗链
  26.                     fs.createReadStream(path.join(__dirname, 'public', './1.jpg')).pipe(res);
  27.                 } else {
  28.                     // 正常显示,如果路径存在,可以正常显示直接返回
  29.                     fs.createReadStream(src).pipe(res);
  30.                 }
  31.             } else {
  32.                 // 正常显示,如果路径存在,可以正常显示直接返回
  33.                 fs.createReadStream(src).pipe(res);
  34.             }
  35.         } else {
  36.             res.end('end');
  37.         }
  38.     });
  39.    
  40. }).listen(8888);
      通过以上不到40行的代码就完成了图片防盗链,想来也并没有辣么麻烦,利用请求头来做的事情还是蛮多的,先来看看防盗链的效果吧。3 P  f) s+ f9 E6 |+ a7 r
  1. <-- html部分 -->
  2. <body>
  3.     <img src="http://www.chenhd.me:8888/2.png" />
  4. </body>
      这里我们修改一下hosts文件,把127.0.0.1指定为两个不同的域名访问:
1 j$ @  ?, i- \( z7 E2 D友情提示:4 B- t8 p! C% F9 G
  • windows系统修改hosts文件地址为C:\Windos\System32\drivers\etc下的hosts文件,拷贝hosts文件修改后替换即可
  • mac系统下较为方便通过终端直接sudo vi /etc/hosts修改即可9 O) k& A9 }6 }) l2 K4 f
      由于html部分我们图片引用的地址就是www.chenhd.me域名下的图片,所以这种情况属于正常访问,直接展示2.png图片了,就是这么酷。
( u8 n+ D8 ?+ p4 K. e& ` 4.jpg 6 A: h! Z8 k7 {9 V* Q: \7 o
       当修改域名为www.chd.me的时候,再次访问就发现已经替换为防盗链图片1.jpg了,看如下效果。8 c" F4 p+ N7 B* Y
5.jpg
3 P* L  v$ R4 q% j       以上内容就实现了如何做一个图片防盗链,防止别人使用你的资源,当然不仅仅是图片防盗链,音频,视频等也可以根据此方法实现,之后大家也可以在工作中尝试尝试。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-23 15:59

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表