什么是防盗链

盗链,顾名思义就是盗窃链接,就是在他人未经允许的情况下,去使用他人站点的任何图片,视频,内容等资源,来借此提升已用的站点的活跃度,严重损坏了别人的利益。那么防盗链就是采用一些办法阻止自己的资源被盗用。

模拟图片防盗链

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

<body>
<h3>哈哈哈哈哈</h3>
<img src="http://c.hiphotos.baidu.com/image/w%3D210/sign=ed30880babec8a13141a50e1c7029157/d52a2834349b033be1a9503e17ce36d3d539bd35.jpg" alt="">
</body>

分两种形式展示

  • 本地file直接打开index.html

  • 本地起一个服务,模拟站点,打开index.html

由此可见,没有起服务时显示的是正常的图片,起了服务后就变了另一张图片,这就是百度对图片做了防盗链处理。

从这个可以得出一个结论,所谓的防盗链处理是针对与服务器上而言的,file起的页面是无效的

实现防盗链

据查阅资料可知,防盗链是可以通过Host和Referer进行比较来实现的,下面用node实现一个防盗链

  • 1 准备两种图片,一个正常下载的图片的,一个为了防盗而显示的图片。

  • 2 准备一个域名,为了模拟服务器。

    host文件 更改

    127.0.0.1 www.sqh17.com
  • 2 实现

    • 思路:

      1. 创建http的server
      2. 首先读取文件,判断文件是否存在
      3. 判断referer和host是否一致,不一致则进行图片
      4. 启动服务
    • 代码

      index.html文件

      <body>
      <h3>哈哈哈哈哈</h3>
      <img src="http://www.sqh17.com:8888/2.png" alt="">
      </body>

      js文件

      let fs = require('fs');
      let path = require('path');
      let http = require('http');
      let url = require('url');
      let static = path.resolve(__dirname, "public"); // 静态资源目录
      let server = http.createServer((req, res) => {
      let referer = req.headers['referer'] || req.headers['referered']; // 兼容性处理 let pos = path.join(static, url.parse(req.url).pathname); // 处理成绝对路径
      fs.stat(pos, err => { // 先判断文件存不存在
      if (!err) {
      if (referer) { // 当存在referer
      let refererHost = url.parse(referer).hostname; // referer地址
      let host = req.headers['host'].split(':')[0]; // host地址 if (refererHost !== host) {
      // 若不一致,则替换图片
      fs.createReadStream(path.join(static, '/fail.png')).pipe(res);
      } else {
      fs.createReadStream(pos).pipe(res);
      }
      } else {
      // 第一次index.html的显示
      fs.createReadStream(pos).pipe(res);
      }
      } else {
      res.end("Not Found");
      }
      }); })
      server.listen('8888', () => {
      console.log('服务器开启成功', '端口:8888');
      })
      • 演示

        当地址栏上的地址是http://www.sqh17.com:8888/index.html时,显示的是正常的图片



        当地址栏上的地址是http://localhost.com:8888/index.html时,显示的是防盗链的图片



总结

防盗链的方式有很多,利用referer和host的比较来实现防盗链是其中的一种,上述方式虽然很简单,但是是提供了一种思路,方便为自己以后的网站搭建。

本文若有什么不对的地方,欢迎大家提出来,一起进步,我把例子和文档放到了GitHub上,欢迎查阅

node实现防盗链的更多相关文章

  1. Node.js——防盗链

    防盗链可以通过判断请求头中携带的referrer是否属于本域名

  2. WEB服务器防盗链_HttpAccessKeyModule_Referer(Nginx&&PHP)

    盗链的概念指在自己的页面上展示一些并不在自己服务器上的内容.也就是获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容.如,小站盗用大站的图片.音乐.视频.软件等 ...

  3. JAVA防盗链在报表中的应用实例

    今天我们来聊聊Java防盗链,多说无用,直接上应用案例. 这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页 ...

  4. nginx secure_link下载防盗链

    下载服务器上有众多的软件资源, 可是很多来源不是本站,是迅雷.flashget, 源源不断的带宽,防盗链绝对是当务之急. 使用来源判断根本不靠谱,只能防止一些小白站点的盗链,迅雷之类的下载工具完全无效 ...

  5. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  6. Code笔记 之:防盗链(图片)

    图片防盗链   参考:http://bbs.csdn.net/topics/330080045    应该是”10种图片防盗的方法“,而不是”10种图片防盗链的方法“,不过看搜索防盗链的人要多一点,所 ...

  7. nginx配置图片防盗链

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 30d; access_log off; valid_referers none blocked ...

  8. php中防盗链使用.htaccess

    下面开始讲解:比如你的图片都在img目录下,那就在该目录下放一个名为 .htaccess 的文件,内容如下: php代码: 以下为引用的内容:RewriteEngine onRewriteCond % ...

  9. 使用Apache的.htaccess就可以防盗链

    Apache的.htaccess可以实现很多功能,如密码保护.禁止显示目录列表.阻止/允许特定的IP地址.实现网址的301 重定向等等.本文就来说说使用Apache的.htaccess如何防盗链. 当 ...

随机推荐

  1. 2019.3.14解题报告&补题报告

    A题 题意: 输入r, c,代表r*c的矩阵,接下来一行,是r个数,代表每一行里最大的数:接下来一行,是c个数,代表每一列中的最大数.求所给数据是否冲突. 思路:判断r个数中最大数maxr和c个数中最 ...

  2. redis 持久化RDB、AOF

    1.redis持久化简介 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集合和有序集合.支持在服务器端计算集合 ...

  3. ngzorro draw 第一次打开 ERROR TypeError: Cannot read property 'overlayElement' of undefined

    at NzDrawerComponent.push../node_modules/ng-zorro-antd/fesm5/ng-zorro-antd.js.NzDrawerComponent.trap ...

  4. Unity 游戏框架搭建 2019 (八) 关于导出 UnityPackage 功能的小结

    导出 UnityPackage 功能到这里要告一段落了,相信认真看的童鞋都有收获.笔者在写教程之前纠结了很久.到底是先给出一坨工具代码,然后再逐个讲解比较好,还是一篇一个知识点比较好.后来想通了.工具 ...

  5. Django 配置使用日志

    一. Django中使用日志 Django中使用日志其实非常简单,只需要在项目使用的配置文件中(如果没有自定义,那么就是settings.py中)加以下设置即可,同时可以根据自己的需求进行修改: # ...

  6. C语言实现strcat / strlen / strcmp / strcpy

    主要考虑两点: 返回值对使用的便利性. 边界,null的判断. strcat char *m_strcat(char *des, const char *src) { assert((des != N ...

  7. [CVPR 2019]Normalized Object Coordinate Space for Category-Level 6D Object Pose and Size Estimation

    论文地址:https://arxiv.org/abs/1901.02970    github链接:https://github.com/hughw19/NOCS_CVPR2019 类别级6D物体位姿 ...

  8. JDBC(二)

    ##  详解JDBC各个对象 1.DriverManager对象:驱动管理对象 *  功能: 1.注册驱动:告诉程序该使用哪个数据jar包 static  void  registerDriver(D ...

  9. 六、深浅拷贝与while循环

    一.深浅拷贝 3.1 浅copy: 浅copy是把原列表第一层的内存地址不加区分完全copy一份给新列表 用法: list1=[ 'egon', 'lxx', [1,2] ] list2=list1. ...

  10. Thread---重排序

    重排序 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一 ...