网站重复请求解决方案
这是讲述如何防止重复请求你的网站, 包括如,爬虫,数据采集,刷排名,批量注册,批量发帖,利用漏洞获取网站数据等等。
1. 访问网站所涉及环节
简单说就是重复相同的请求
首先看看访问流程所设计的每个环节
User -> Browse -> CDN/Proxy Cache -> Web Server -> App Server / fastcgi pool -> Cache -> Database
大部分网站都是这样的结构:用户,浏览器,CDN或反向代理,Web服务器,应用服务器,缓存,数据库
这个访问过程中所涉及的设备
PC -> ADSL/Cable/Ethernet -> Route -> ... -> Route -> Firewall -> Load Balance -> Switch -> Server
我们看看从那些环节可以截获用户的刷新行为
可控制环节
- CDN / 反向代理,提供一些基本防护功能,过于简单。
- 3/4层设备,防火墙/路由器/交换机,主要还是靠防火墙设备,例如Cisco ASA 系列防火墙,都提供IPS/IDS服务(需要单独采购,设备默认没有)主要是针对IP地址的请求频率做出策略控制,
- 4/7 层负载均衡设备, 一半负载均衡设备都附带此功能。但不是他主要的功能,没有能力购买防火墙设备的中小公司可以使用该功能,7层功能非常强大,但都是通用功能,不一定满足你的个性化需求。
- 浏览器,这是主要是改变浏览器端设置,利用Cookie变化,Javascript等技术,阻止重复请求
- WEB 服务器,在web上通过扩展模块与相应的配置也能达到一定的效果
- 应用服务器, 主要是通过编写程序在阻止恶意访问。
依次从上至下,越能提前在上一层阻止行为越好,否则就在下一层截获。
2. 浏览器款控制方案
通过 Javascript 防止重复点击提交按钮,通常的做法是将按钮禁用 通过 disabled 属性实现。下面是Jquery例子
$("form").submit(function(){
$(":submit",this).attr("disabled","disabled");
});
在上面的例子基础上可以改良,增加计时器,限制一定时间内不可重复提交。
通过 Cookie技术控制重复访问动作
访问第一个页面 login.example.com/form.ext 的时候设置一个 cookie 变量
访问第二个页面 login.example.com/auth.ext 的时候判断上一个页面设置的 cookie 是否有效,如果无效拒绝访问。
可以进一步增加难度,例如用户注册分为很多步骤,每一个步骤都会设置一个标记,如果用户行为不是按照顺序访问,直接在最后一个页面提交,明显可以判断是非法行为。
这里的方案是针对人工操作,更多的时采用程序实现刷新,采集,爬虫等等。
3. CDN 与 反向代理
CDN 都提供一些基本的防护功能,主要是针对 IP 地址, URL 做一些限制
如果自己做反向代理,控制权更大&#x