在上一篇文章中提到了利用两种方法进行防盗链:1.reffer 限制用户来源(可很容易制造一个reffer)2.使用密钥通信(使用ip为每个用户进行加密)
设想就把这两种方法结合使用,但合并使用时很快遇到问题;
例如:
用户上网使用ADSL或其他方式,ip是动态,当用户这时间下载了 重启电脑或停止一段时间后再下载,用户的IP已经改变,不能继续下载。
这时候想到一个方法,猜想下载工具或使用浏览器进行第一次到达的时候是使用HTTP/1.0,后面下载是使用HTTP/1.1协议(攻击者或非法下载都 是使用HTTP/1.0)下载,所以使用条件$server_protocol ~ HTTP/1.1就不再进行验证。呵呵 这种想法一开log检验就行不通了,因为每次浏览器或下载工具到了服务器端都是使用HTTP/1.1(连第一次 也是),所以,使用协议形式还是行不通。
既然ip不行,想其他策略进行对付,对HTTP/1.0和HTTP/1.1进行分而治之,1.0继续使用ip,1.1使用useragent进行对应加密。
为啥1.0能继续使用ip?? 因为http1.0没有续传功能,正常用户不太可能使用该进行下载(前面已提到浏览器和下载工具是使用1.1)
所以使用ip进行加密是最有效。
例子:
valid_referers none blocked server_names xx.com;
…………
if ( $server_protocol ~ "HTTP/1.0" ) {
rewrite /(.*) /http1.0/$1 ;
}
location / {
root html;
index index.html index.htm;
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "p";
accesskey_signature "sky$http_user_agent";
}
location /http1.0 {
access_log logs/access_1.0.log main;
rewrite /http1.0/(.*) /$1 break;
root html;
index index.html index.htm;
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "p";
accesskey_signature "sky$remote_addr";
}
展望:
如果1.0出现的情况还频繁,可以加上时间限制例如在nginx配置文件里面加上:
http{
……………
perl_set $mytime '
sub {
my($sec,$min,$hour,$mday,$mon,$totalTime);
($sec,$min,$hour,$mday,$mon) = localtime(time);
####继续做时间段的加长
return $hour;
}
';
}
把$mytime与时间结合使用,这样就可以为密钥加上过期的时间范围。(需要nginx perl模块支持)
继续nginx的防盗链
作者: skybin090804 发布时间: 2010-11-18