lighttpd with secdownload,构建安全高效的下载站(应对迅雷有高招了)
07月 12, 2007 on 11:53 pm | In 未分类 |下载站是一类特殊的站点,站长们已经不需要为流量担心了。他们只需要担心服务器的负载了。尤其是现在迅雷等近乎掠压者的软件出现以后。
lighttpd是近来日渐流行的一个轻量级,着眼于高负载性能的开源的,免费的web服务器软件。在很多方面比如mod_rewrite方面与行业巨头apache很相似,
使得从apache往lighttpd上的迁移成本相对较低。
但是个人感觉,lighttpd还是着眼于高负载载上并不失灵活性。例如为了迎合日渐流行的在线视频站点如youtube类站点的胃口,还专门出一个针对flv下载的模块,
这个模块相当偏门。
lighttpd上还有一个专门针对下载站点的模块:mod_secdownload
根据其官方wiki文档,mod_secdownload有四个配置选项:
- secdownload.secret = <string>
- secdownload.document-root = <string>
- secdownload.uri-prefix = <string> (default: /)
- secdownload.timeout = <short> (default: 60 seconds)
在这个模块出现以前,人们也曾有几个思路去应对盗链:
1.修改WEB应用。比如直接通过PHP读取文件内容,发送二进制码。由于发送过程完全可控,这个对访问者的控制完全准确,比如想限制只有登陆用户才可以下载等等,易如反掌。问题是,每一次下载都通过php进行,严重地影响了服务器的效率。磁盘IO,CPU占用都容易跑满。
2.编程实施,自行设计一些服务器模块。比如weidy同学以前好像做过IIS下的过滤器,思路是在IIS中通过插入Hook,检测对静态下载文件(zip,exe,rar等文件的HTTP请求头中是否存在一个特定的Cookie,而这个cookie是有有效期的。当然这是可以的,我还有更好的思路,那就是,自己写一个web server,你想干什么就干什么,你要加一个彩蛋以便每当有用户访问时都要你站长大人先按一下电话按键用户才可以继续下载都行…..问题是,不是所有人都会。而且,实施也是一大麻烦。
3.基于服务器的现有模块,依照某些访问特性,比如来源页面(HTTP_REFERER)进行限制。但是,现在的盗链网页已经非常聪明了,迅雷更聪明:它能精确地学习前人在下载该软件时的数据,模仿性地发送特定的HTTP_REFERER(说不定将来连COOKIE也一起发送),非常牛B.所以像车东简单地这样写上:
- RewriteEngine on
- RewriteCond %{HTTP_REFERER} !^http://(www\.)?niernier\.com/.*$ [NC]
- RewriteRule \.(mp3|rar)$ http://www.niernier.com/archives/000445.html [R=301,L]
- #RewriteLog "logs/rewrite.log"
- #RewriteLogLevel 3
已经没用了,当然用这个防止通过baidu搜mp3还是可以的,对迅雷,没用。某些牛X的网站好像也能突破这种简单的防盗链。
好了,现在看看light官方网站给出的办法:
首先,某些东西是一定要经常改变的.或者是Cookie,或者是URI,等等。而URI是最好操作的。
另外,URI中一定要有一个加密性的东西,在secdownload中,secdownload.secret选项就是让站长自行设置的一个密串。(当然这个密串要足够保密>>>)
然后,我们用PHP来生成软件下载链接:
- <?php
- $secret = "verysecret";
- $uri_prefix = "/dl/";
- # filename
- $f = "/secret-file.txt";
- # current timestamp
- $t = time();
- $t_hex = sprintf("%08x", $t);
- $m = md5($secret.$f.$t_hex);
- # generate link
- printf('<a href="%s%s/%s%s">%s</a>',
- $uri_prefix, $m, $t_hex, $f, $f);
- ?>
看到了吗?这个新的链接包含了md5后的密钥(“verysecret”,在lighttpd.conf中指出),同时包含了时间特征串。这个时间串与文件名,密钥一起参与了md5计算,以便对下载客户端提交的URI进行校验。如果不把时间放进去md5,客户端便可以假造URI,任意修改时间串。
还是把官方给的lighttpd.conf中的相关配置也给出:
- server.modules = ( ..., "mod_secdownload", ... )
- secdownload.secret = "verysecret"
- secdownload.document-root = "/home/www/servers/download-area/"
- secdownload.uri-prefix = "/dl/"
- secdownload.timeout = 120
现在,把你所有的页面的链接改成用这个php操作运算过的新地址吧。这个新地址被正确地被lighttpd解码并进行传送。
有趣的是,如果访问的URL已经超时失效,lighttpd送出的头是“408 Request Timeout” ,这不是一个标准的HTTP协议头,这是为了欺骗一下客户端。
当然,没有什么能永远防止疯狂下载。更妥善一点的情况是,这个下载地址并不是在html中直接给出,而是通过javascript来写出。即便是这样,如果hacker们
愿意,他也可以让一个firefox在后端访问该页并解析javascript最后遍历dom节点…. 得到该地址。你的地址每2分钟就超时,他也可以每2分钟来造访一次,拿到新地址。但是 有几个网站能够得到这种级别的高手的青睐呢?
1条评论 »
发表评论
Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds.
Valid XHTML and CSS. ^Top^
还是记录cookie比较靠谱,趁迅雷还来不及取cookie吧…… 动态URL的问题主要是不适合CDN进行缓存;
评论 由 Che Dong — 05月 12, 2008 #