Browsed by
月份:2014年9月

[原创]如何在nginx下防盗链,重点防迅雷

[原创]如何在nginx下防盗链,重点防迅雷

转载注明出处:https://flfq.peuland.com/

今天跟人讨论到防盗链的方案,当然重点是防迅雷,网上看了别人的方案,一个都没有真正解决问题,还在用referer判断,以下内容需要nginx,并加载lua模块

所以今天特地写了一下这文章

现行的防盗链的方法无非是检测referer头,因为http请求中常会指明referer,这相当于生活中你去拜访某人,需要别人的推荐信,referer就相当于推荐信,但这里有个问题哪,这个信可以随便伪造的哪,你没办法验明真伪的!!

所以迅雷就常用伪造的referer欺负小朋友们了。

那我们怎么办?因为用户下载的文件,肯定有特定的格式,比如rar,zip,exe,jpg等等,而这些不可以直接访问的,肯定需要你有个指引的界面,这个界面可能是 html,php,jsp,asp 等等网页格式

那如果是真用户,肯定是浏览了你的html ,php ,jsp ,asp 等网页后,才能知道你的文件下载链,才能下载!这过程肯定的,除非对方是天神,直接猜中你的下载链接 ,不然肯定要看了你的页面(包括广告,这是你的收益的重点),才能下载

OK!那我们如何在一张极简单的html上面给个zip文件的下载地址,并防盗链?
我们在用户观看html 等简单网页的时候,输出给客户一个cookie 值,你肯定要笑了,html怎么输出?这个可以由nginx代劳

代码如下

location ~* \.(htm|html)$ {
   rewrite_by_lua '
    local TaMud_id = ngx.md5("TaMud" .. ngx.var.remote_addr)
   if (ngx.var.cookie_TaMud_id ~= TaMud_id) then
       ngx.header["Set-Cookie"] = "TaMud_id=" .. TaMud_id .. ";path=/;"
--       return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)
   end
  ';
    }

上面代码写入你的nginx 的网站config配置中(以上需要nginx vhost 配置知识,并懂一点Lua语言)
这里需要注意的是 nginx conf 中注解是 # ,因为这里一断是Lua 代码,其注解是 — 两个减号,切记切记,注解是不同的,你不要调试的时候搞错了,到时候弄的骂我

上面的代码意义是,获得用户的IP地址,然后加上TaMud这个关键字(TaMud关键字一定要换成别人不知道的),取其MD5码(这了防迅雷)
然后检测用户的cookie如果传过来的 cookie里有TaMud_id 这个值,并跟本地计算出来的值是否一样( 防人伪造),如果不一样,就把本地计算出来的值传给人家

OK,当用户浏览你页面的时候,他的本地就获得了cookie TaMud_id这个值!

那当他要下载你的机器上的zip文件的时候,使用nginx  再进行同样的判断,如果没有相关的值,就不停的进行302跳转,跳死他,代码如下

location ~* \.(zip|rar|exe)$ {
   rewrite_by_lua '
    local TaMud_id = ngx.md5("TaMud" .. ngx.var.remote_addr)
   if (ngx.var.cookie_TaMud_id ~= TaMud_id) then
--       ngx.header["Set-Cookie"] = "TaMud_id=" .. TaMud_id .. ";path=/;"
       return ngx.redirect(ngx.var.scheme .. "://" .. ngx.var.host .. ngx.var.uri)
   end
  ';
    }

此处代码跟上面的有所不同,注解掉的是,回给用户的cookie,因为这里下载的是文件,不需要回给用户COOKIE,不然对方支持cookie的话,你就中招了,这里只需要302跳转,让他不停的跳

OK,到此你就成功了

就算迅雷把下载链接,人家COOKIE值,人家传递值都回抓取并共享给他的客户也没有用了,因为IP不同,算出来的TaMud_id 不同,所以人家用迅雷下载的话,就会不停的在 302 里跳转。

当然你也可以神仙一样的,修改一下 return ngx.redirect(“https://www.peuland.com“) 这你的网站首页,这样人家就跳到你的首页去

说出来是不是很简单,你只需要nginx + lua 的知识,就行了,当然其实你还需要了解很多的知识

问题是这么神一样存在的方案,网上竟然到现在还没有,所以在此公开一下

按以往经验,要被人理解并流行开,又要一两年经验

我这算是对迅雷落井下石不?