防盗链

什么是防盗链?


首先要清楚什么是盗链

盗链指在自己的页面上展示一些并不在自己服务器上的内容。
常见的是小站盗用大战的图片、音乐、视频、软件等资源。
通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。

防盗链概念

防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。

防盗链工作原理


通过Referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。
一旦检测到来源不是本站即进行阻止或返回指定到页面。

防盗链两种实现方式


(1)Referer 方式

Nginx 模块 ngx_http_referer_module 用于阻挡非法来源到域名请求。
Nginx 指令 valid_referers,全局变量 $invalid_referer

valid_referers none|blocked|server_names|string...;
none: "Referer" 来源头部为空的情况;
blocked: "Referer" 来源头部不为空,但里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头;

修改Nginx配置文件: nginx.conf

案例:
  localtion ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
  {
      valid_referers none blocked baidu.com *.zed.kim;
      if($invalid_referer){
        # return 403;
        
        rewrite ^/ https://www.zed.kim/403.jpg;
      }
  }

针对目录的防盗链:
  location /images/
  {
    ...
    ...
  }

(2)加密签名方式

传统Referer防盗链,可以伪造Referer进行访问。

防盗链的第二种实现方式,采用加密签名的方式解决Referer存在的问题。
使用第三方模块HttpAccessKeyModule实现Nginx防盗链,判断签名是否正确。

accesskey on|off  #模块开关
accesskey_hashmethod md5|sha-1  #签名加密方式
accesskey_arg "GET参数名称"
accesskey_signature "加密规则"

案例:
  location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
  {
      accesskey on;
      accesskey_hashmethod md5; #两端之间加密方式需要保持一致
      accesskey_arg "signKey";
      accesskey_signature "Mr.Chen$remote_addr"; #自定义盐 + 客户端IP通过md5加密,就能得到PHP端加密的秘钥
      #如果和PHP端加密得到的秘钥一致,则验证成功,返回图片,否则返回403
  }

  <?php
      // md5(Mr.Chen + IP)

      $signKey = md5('Mr.Chen'.$_SERVER['REMOTE_ADDR']);

      echo '<img src="https://www.zed.kim/test.png?signKey='.$signKey.'" >';
  ?>

这种方法安全性虽然提高了,但是每次请求图片都要加上signKey,相对麻烦很多。

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注