WEB资源防盗链

WEB资源防盗链

什么是防盗链

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

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

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

防盗链:防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源的展示页面的资源链接失效。可以大大减轻服务器及带宽的压力。

工作原理:

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

Referer

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

Nginx 指令 valid_referers,全局变量$invalid_referer

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

noneReferer 来源头为空的情况

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

server_namesReferer来源头部包含当前的 server_names

nginx配置文件如下

1
2
3
4
5
6
7
8
9
10
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
{
valid_refers none blocked imooc.com *.imooc.com;
# 如果判断来源合法 invalid_referer 是 0
if ($invalid_referer)
{
rewrite ^/ http://www.imooc.com/403.jpg;
}
expires 30d;
}

传统防盗链遇到的问题:

伪造Referer

使用签名

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

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

nginx示例配置文件如下:

1
2
3
4
5
6
7
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
{
accesskey on;
accesskey_hashmethod md5;
accesskey_arg sign;
accesskey_signature "jason$remote_addr"
}

如上的配置,需要PHP实现请求参数的代码如下

1
2
3
<?php
$key = "jason".md5($_SERVER["REMOTE_ADDR"]);
echo '<img src="./a.png?sign='.$key.'">';