大流量高并发解决方案课题 02 web资源防盗链

作者: JONE 分类: 编程 发布时间: 2018-04-14 12:06

相关概念

1)什么是盗链

盗链,就是指在自己的页面展示展示一些并不在自己服务器上的内容。获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。

常见的是小站盗用大战的图片、音乐、视频、软件等资源。

通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。

2)防盗链

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

可以大大减轻服务器及带宽的压力

工作原理

通过Referer或者签名,网站可以检测目标网页访问的来源网页,如果是自愿文件,则可以跟踪到显示它的网页地址。

一旦检测到来源不是本质即进行阻止或者返回指定的页面。

Nginx模块 ngx_http_referer_module 用于阻挡来源非法的域名请求

Nginx指令 valid_referers ,全局变量 $invalid_referer

Referer

valid_referers  none | blocked | server_names | string ...;

none:“Referer” 来源头部为空的情况

blocked:“Referer” 来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https//开头

server_names:“Referer” 来源头部包含当前的server_names

案例

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

}

当访问 gif/jpg/png/flv/swf/rar/zip结尾的文件的时候 valid_referers 的参数被允许的,当访问来源是合法时的则 $valid_referer 的值为 0 ,不合法时则为1,重写url访问路径。

传统防盗链可以通过伪造Referer来实现盗链。可以使用加密签名解决

加密签名

使用第三方模块HttpAccessKeyModule实现Nigix防盗链

accesskey   on | off  模块开关

accesskey_hashmethod md5 | sha-1 签名加密方式

accesskey_arg   Get参数名称

accesskey_signature  加密规则

localtion ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
{
    accesskey_on;
    accesskey_hashmethod md5;
    accesskey_arg   "sign";
    accesskey_signature  "jason$remote_addr";
}

当访问gif|jpg|png|flv|swf|rar|zip静态资源的时候

<?php
$sign = md5('jason'.$_SERVER['REMOTE_ADDR']);
// echo '<img src="./logo.png">';  // 本服务器中有本图片,又要开启了签名所以无法正常访问
echo  '<img src="./logo.png?sign= '. $sign .' ">';  //get请求带上密钥参数时就可以正常访问了
?>