Nginx的防盗链

一、一般的防盗链如下:
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked ;
if ($invalid_referer) {
rewrite ^/ http://www.ccvita.com/403.html;
#return 404;
}
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行:
表示对www.ccvita.com www.phpq.net这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回404也是可以的。

二:针对图片目录防止盗链

location /p_w_picpaths/ {
alias /data/p_w_picpaths/;
valid_referers none blocked server_names *.xok.la xok.la ;
if ($invalid_referer) {return 403;}
}
 

三、NginxHttpAccessKeyModule实现防盗链

1. 下载NginxHttpAccessKeyModule模块文件:;
2. 解压此文件后,找到nginx-accesskey-2.0.3下的config文件。编辑此文件:替换其中的”$HTTP_ACCESSKEY_MODULE”为”ngx_http_accesskey_module”;

vi config

--content-- 
USE_MD5=YES
USE_SHA1=YES
ngx_addon_name=ngx_http_accesskey_module
HTTP_MODULES="$HTTP_MODULES ngx_http_accesskey_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_accesskey_module.c" 
 
3. 用一下参数重新编译nginx:

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/src/soft/nginx-accesskey
4. 修改nginx的conf文件,添加以下几行:
location /download {
  accesskey             on;
  accesskey_hashmethod  md5;
  accesskey_arg         "key";
  accesskey_signature   "mypass$remote_addr";
}
其中:
accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。
3 make && make install

按照以上的设置,download文件夹下所有的文章如果用地址直接引用,比如http://www.xinkexue.com/download/test.rar,都会提示403错误,无法访问到资源,这也就是我们说的防盗链功能已经生效。那么要如何才能让我们的目标用户下载这些文件呢?方法就是我们要给用户一个正确的链接,形如http://www.xinkexue.com/download … 3b5423523952352bg2g

这个key后面的参数是根据前面设定的accesskey_hashmethod和accesskey_signature确定的,比如我们前面的设定就是对password$remote_addr($remote_addr代表客户端传递过来的IP)的值进行MD5加密运算得到的结果。我们要把带有 key值的地址重新定向给目标用户,这样我们的目标用户才能下载到资源,没有key或者key值错误,都将被认为是盗链,而无法下载。

下面我们用PHP脚本的header重定向函数举例说明:
<?php
//其他代码省略
//header函数实现重定向
header("location:http://www.91vmall.com/shop/test.rar?key=".md5("password".$_SERVER['REMOTE_ADDR']));
这样用户就能顺利访问到含有正确key值的资源了。
最后提一句,要实现真正的深度防盗链,需要有冗余备份防盗链措施辅助,比如你可以即使用传统的判断referer的防盗链,
再结合accesskey模块,那么大约能够保证万无一失了.
key加密方法:
给这个字符串md5加密"123443555$remote_addr"    //密钥字符串,变量$remote_addr是客户端ip地址
生成的加密串是32位小写的:7f938c21e8669463a881d4b6509b8c04
关于资源加密和防盗链:
正常的资源真实地址   这个直接下是非法的会被拒绝
用户要在网站点击下载某个文件的时候程序自动生成一个key,然后给他一个下载链接,他用这个连接就能合法下载了
每个客户每次下载的时候都要生成一次这个key 
当他下完把这个链接复制给别人或者发布到其它网站的时候 因为ip不同别人就下不了

相关文档

《》:http://www.ccvita.com/348.html
《》:http://www.ccvita.com/336.html
《》:http://www.ccvita.com/319.html
《》:http://www.ccvita.com/312.html