码迷,mamicode.com
首页 > Web开发 > 详细

httpd之防盗链和限制下载

时间:2016-06-06 09:13:59      阅读:588      评论:0      收藏:0      [点我收藏+]

标签:style

    配置httpd防盗链可以用SetEnvIfNoCaserewrite实现反盗链(Anti-Leech)

一、使用SetEnvIfNoCase,注意放行自己的网址
SetEnvIfNoCase Referer "^http://.*\.sunnysky\.com" local_ref
SetEnvIfNoCase Referer ".*\.byqk\.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(png|txt|doc|mp3|zip|rar|jpg|gif)">
    Order Allow,Deny
    Allow from env=local_ref
</filesmatch>

说明:查看awstats的日志分析,没有发现什么异常。于是把access log日志拉下来,用逆火网站日志分析器检查了一下站点盗链情况

二、使用 rewrite 技术实现 Apache 防盗链
    查看rewrite模块是否启用
LoadModule rewrite_module modules/mod_rewrite.so
    
在需要配置防盗链的主机添加以下内容
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://jb51.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://jb51.net$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.jb51.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.jb51.net$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.jb51.net/about/nolink.png [R,NC]

  有些用户使用的是虚拟主机,没有服务器的控制权,无法修改 httpd.conf 文件和重启服务器。那么请确认你的虚拟主机支持 .htaccess,将上面的配置写入 .htaccess 文件,放入根目录或图片所在的目录即可:
注意: 
1、httpd.conf 文件里的配置,是在 apache 启动时一次读取,效率很高
2、.htaccess 文件里的配置,每次访问都需要读取分析,效率很低。

防盗链原理
    http标准协议中有专门的字段记录referer

一来可以追溯上一个入站地址是什么
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么。
因此所有防盗链方法都是基于这个Referer字段
 
    话说现在建站真不容易,想好好搞一个站,总会被人WC的采集,盗链,攻击,无人值守的垃圾站比苦心经营的站收入还要可观。所以保卫好自己的服务器是一件很重要的工作。
    小站雷当(LeiDown.Com)刚刚上线,立马受到很多朋友的支持和拥护。一开始本来准备选择使用FTP作为下载服务器的,不过过了几天就发现很多都是通过盗链的方式来FTP下载。这下服务器在持续性全速提供上传,但是网站的页面浏览量却少得可怜。因为FTP天生不能放盗链的特性所以只能考虑放弃使用,最后决定用HTTP下载来替代。
 
    直接用HTTP服务器下载也不是很容易的事。最开始在IIS里面配置,IIS只能设定最大下载速度和最大连接数,这对于一些使用下载工具一来就开50+线程霸道下载的朋友明显是防不住的。网上搜了N久就发现一个用Delphi写的看不懂的ISAPI Filter以及别的收费软件若干。试过之后都起不了作用,也便放弃了,最后发现Apache有这些开源的功能模块,最终打造出完美限制的HTTP下载服务器。
 

防盗链、限制客户端下载线程数,限制下载带宽。下面一一介绍怎么在Apache里面实现这些功能。
 
一、防盗链,使用Cookie
    传统的防盗链都是通过Referer来判断用户来路的,不过这样的方法对于下载工具来说形同虚设,因为现在的下载工具早就能伪造Referer了。
 
    现在一些流行的防盗链的方式都是用在浏览页面的时候产生一个随机验证码,在用户点击连接的时候服务器会验证这个验证码是否有效从而决定是否允许下载。或者就是用某些方法把文件实际地址进行伪装。不过我觉得这些都不怎么好用,我用了一个简单有效的方式来实现防盗链。
 
    其实就是用Cookie,配合Apache的URL Rewrite模块很简单的就能实现防盗链下载。
    首先在浏览页面的时候,会向客户端发送一个特别的Cookie,例如“Site=LeiDown.Com“,盗链而来的将没有这个Cookie。
 
在Apache的httpd.conf文件里面搜索:
 
#LoadModule rewrite_module modules/mod_rewrite.so 
把它前面的#去掉,再找到<Directory />块,在里面加入类似如下代码:
 
<Directory />
   RewriteEngine On # 启动URL Rewrite引擎
   RewriteCond %{HTTP_COOKIE} !^.*(?:Site=LeiDown.Com).*$ # 对于Cookie里面没有特殊记录的请求进行重定向
   RewriteRule ^.*$ error.html # 将非法访问重定向到错误页面
</Directory>

    这样如果一个盗链而来的请求将会因为没有特殊Cookie而被重定向到错误页面,就算实际地址暴露也不怕。至于这个Cookie的内容是什么以及有效时间完全可以由管理员自己来设定,也就是说下载工具也没法伪造,从而防止了服务器资源被盗链的危险。

限制客户端多线程下载 
    限制多线程现在需要用到一个Apache的扩展模块mod_limitipconn,这里是作者的官方网站
    http://dominia.org/djao/limitipconn2.html,先下载适合自己版本的模块文件到Apache安装目录下的modules目录下面,然后在httpd.conf文件中搜索:
#LoadModule status_module modules/mod_status.so
把它前面的#去掉,再加入: 
ExtendedStatus On
LoadModule limitipconn_module modules/mod_limitipconn.dll # 如果你下载的不是Win版,请把后面的文件名改为你所下载的文件名
<IfModule mod_limitipconn.c>
   <Location /> # 这里表示限制根目录,即全部限制,可以根据需要修改
   MaxConnPerIP 2 # 这里表示最多同时两个线程
   NoLimit html/* # 这里表示html目录下不受限制
   </Location>
</IfModule> 
    这样来自同一客户端的超过2个的线程请求将被拒绝,从而限制了客户端的多线程下载。

限制下载带宽
 
    这个同样需要扩展模块支持,模块是mod_bw,在作者的官方网站http://ivn.cl/apache/可以下载到。同样也是放入modules目录下面,然后在httpd.conf文件中加入:
 
LoadModule bw_module modules/mod_bw.dll
 
再找到<Directory />块,加入:
<Directory />
   # Other configurations …
   BandwidthModule On # 启动带宽限制
   ForceBandwidthModule On # 启动带宽限制
   MaxConnection all 2000 # 最大连接数2000
   Bandwidth all 200000 # 单个客户端最大带宽200KB
</Directory>
 
这样限制了同时最多2000个连接数,每个客户端最大200KB的下载带宽。




httpd之防盗链和限制下载

标签:style

原文地址:http://hiyang.blog.51cto.com/10728919/1786426

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!