用户名: 密码: 忘记密码? 注册

继续nginx的防盗链

作者:  时间: 2010-11-18
在上一篇文章中提到了利用两种方法进行防盗链: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模块支持)