lighttpd with secdownload,构建安全高效的下载站(应对迅雷有高招了)

07月 12, 2007 on 11:53 pm | In 未分类 | 1 Comment

下载站是一类特殊的站点,站长们已经不需要为流量担心了。他们只需要担心服务器的负载了。尤其是现在迅雷等近乎掠压者的软件出现以后。
lighttpd是近来日渐流行的一个轻量级,着眼于高负载性能的开源的,免费的web服务器软件。在很多方面比如mod_rewrite方面与行业巨头apache很相似,
使得从apache往lighttpd上的迁移成本相对较低。
但是个人感觉,lighttpd还是着眼于高负载载上并不失灵活性。例如为了迎合日渐流行的在线视频站点如youtube类站点的胃口,还专门出一个针对flv下载的模块,
这个模块相当偏门。
lighttpd上还有一个专门针对下载站点的模块:mod_secdownload
根据其官方wiki文档,mod_secdownload有四个配置选项:

  1. secdownload.secret        = <string>
  2. secdownload.document-root = <string>
  3. secdownload.uri-prefix    = <string>  (default: /)
  4. 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.所以像车东简单地这样写上:

  1. RewriteEngine on
  2. RewriteCond %{HTTP_REFERER} !^http://(www\.)?niernier\.com/.*$ [NC]
  3. RewriteRule \.(mp3|rar)$ http://www.niernier.com/archives/000445.html [R=301,L]
  4. #RewriteLog "logs/rewrite.log"
  5. #RewriteLogLevel 3

已经没用了,当然用这个防止通过baidu搜mp3还是可以的,对迅雷,没用。某些牛X的网站好像也能突破这种简单的防盗链。

好了,现在看看light官方网站给出的办法:
首先,某些东西是一定要经常改变的.或者是Cookie,或者是URI,等等。而URI是最好操作的。
另外,URI中一定要有一个加密性的东西,在secdownload中,secdownload.secret选项就是让站长自行设置的一个密串。(当然这个密串要足够保密>>>)

然后,我们用PHP来生成软件下载链接:

  1. <?php
  2.  
  3. $secret = "verysecret";
  4. $uri_prefix = "/dl/";
  5.  
  6. # filename
  7. $f = "/secret-file.txt";
  8.  
  9. # current timestamp
  10. $t = time();
  11.  
  12. $t_hex = sprintf("%08x", $t);
  13. $m = md5($secret.$f.$t_hex);
  14.  
  15. # generate link
  16. printf('<a href="%s%s/%s%s">%s</a>',
  17.        $uri_prefix, $m, $t_hex, $f, $f);
  18. ?>

看到了吗?这个新的链接包含了md5后的密钥(“verysecret”,在lighttpd.conf中指出),同时包含了时间特征串。这个时间串与文件名,密钥一起参与了md5计算,以便对下载客户端提交的URI进行校验。如果不把时间放进去md5,客户端便可以假造URI,任意修改时间串。
还是把官方给的lighttpd.conf中的相关配置也给出:

  1. server.modules = ( ..., "mod_secdownload", ... )
  2.  
  3. secdownload.secret          = "verysecret"
  4. secdownload.document-root   = "/home/www/servers/download-area/"
  5. secdownload.uri-prefix      = "/dl/"
  6. secdownload.timeout         = 120

现在,把你所有的页面的链接改成用这个php操作运算过的新地址吧。这个新地址被正确地被lighttpd解码并进行传送。
有趣的是,如果访问的URL已经超时失效,lighttpd送出的头是“408 Request Timeout” ,这不是一个标准的HTTP协议头,这是为了欺骗一下客户端。

当然,没有什么能永远防止疯狂下载。更妥善一点的情况是,这个下载地址并不是在html中直接给出,而是通过javascript来写出。即便是这样,如果hacker们
愿意,他也可以让一个firefox在后端访问该页并解析javascript最后遍历dom节点…. 得到该地址。你的地址每2分钟就超时,他也可以每2分钟来造访一次,拿到新地址。但是 有几个网站能够得到这种级别的高手的青睐呢?

lighttpd上搞定wordpress,给出详细步聚.

06月 16, 2007 on 8:17 pm | In 未分类 | No Comments

千辛万苦,终于将博客搬家了。原来是用的edong.com的主机,现在转到了lighttpd+fastcgi上面。

第一步:导出原空间的数据。这个得用phpmyadmin来进行。注意的时,在导出数据时,由于导出来的中文有乱码,故而我先将所有text,varchar类型数据转成了blob类型 ,然后选中将“二进制区域使用十六进制显示”这一项,这样,导出的数据中就不会有显示不了的乱码什么的,有文字的地方都是0xf535acd….这样的东东。

第二步:自然是在新服务器上用mysql -u *** -p newdatabasename < export.sql 将数据库导入进去。

第三步:修改wp-config.php中数据库连接信息。

第四步:如果这时你访问时,能直接用原密码直接进入数据库,那么很幸运,你直接登陆就是了!

如果能登陆,但进入后台时,提示你无权限进入本页面,那么也很幸运,你又可以再熟悉一次安装流程了。这时很简单,把wp-config.php中的表示数据表前缀的改掉,然后再走流程安装一次。安装完后之后,记得登陆phpmyadmin把你需要的表比如wp_posts改成新的前缀名(之前你当然得删除wordpress的安装流程为你生成的对应的表)。比如,本来我的表都是带wp_的前缀,现在将table_prefix改为wp_2然后进行了安装,那么您应该把wp2_posts表删掉,然后把wp_posts改名为wp2_posts.同理,其他需要转移的表比如comments,categories等 等也要转移地过来。

在安装时,我遇到了一点小麻烦:当输入我的email进行下一步时,系统提示这是第二步,并告诉我将要进行一些建表,加载数据操作。但是不幸地是,没有告诉我新生成的密码!我找到了这一行:

  1. </p>
  2. <p>$random_password = substr(md5(uniqid(microtime())), 0, 6);</p>
  3. <p>

改成为

  1. </p>
  2. <p>$random_password="123456";<br />

然后将

  1. </p>
  2. <p>@wp_mail($admin_email,_("New wordpress blog",....)</p>
  3. <p>

注释掉。现在没有什么拦住我了。我猜想是因为新的机器上没有sendmail服务,所以导致安装进程不能进行下去。现在安装成功能,默认密码就是:123456.

最后一步:太重要了:修改永久链接,以保持和原来的url一致。如果你的博客pr不高,访问量不怎么高,那么做不做无所谓。但是从SEO角度讲,最好还是保持一致。我原来的博客的链接设置的是:

  1. </p>
  2. <p>/archives/%post_id%.html</p>
  3. <p>

但是现在是lighttpd做server,它不支持apache的.htaccess文件里写mod_rewrite规则,怎么办?

我google了一下,找到一段巨复杂的正则表达式,却仍 不管用。自己看了一下.htaccess:

  1. </p>
  2. <p>RewriteCond %{REQUEST_FILENAME} !-f<br />
  3. RewriteCond %{REQUEST_FILENAME} !-d<br />
  4. RewriteRule . /index.php [L]<br />

就是指当请求的地址不是一个文件也不是一个目录时,转向到index.php这个文件来处理,由index.php来判断、处理。okay,现在好办了,我马上在lighttpd里加了这么一段:

  1. </p>
  2. <p>server.error-handler-404= "/index.php"</p>
  3. <p>

.okay,现在重启lighttpd,一切完美!现在你的wordpress又可以像在apache下拥有mod_rewrite一样可以随意设置永久链接了!

特别感谢老覃同志的帮忙.

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^