- 当网站对外进行数据接口服务时,总会有人进行扫站、暴力破解。如果不进行防范,则会对用户体验或者网站安全造成很大的影响。今天站长,总结一下防止暴力破解,或者防止别人爬取网站内容的一些建议。
- 这些建议只是建站一年来的,积攒下来的经验。没有经过系统性的学习。如有错误,请见谅
- 俗话说知己知彼,百战不殆。想防止别人暴力破解或者爬虫,就需要知道对方会怎么暴力破解。
- 一、攻击措施
-
- 1. 使用专业的爬虫工具
-
- 网上有各种成熟的Java爬虫,Python爬虫框架,只要稍微了解一下,怎么配置,就会得到一个很完美的爬虫框架。Arachnid、crawlzilla、jcrawl、JSpider等。
- 2. 阅读网站接口,定制爬虫
- 熟悉网络编程的,会阅读作者的html代码,可以得到网站请求的post get 数据。
- 通过自己手工编程,就可以批量得到网站站长的接口数据。
- 比如下面就是一个非常简易的PHP爬虫,但是功能十分强大。
function get($url ){
$ch = curl_init();
$header = array(
“header:xxxxx”,
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_REFERER, “http://www.baidu.com/”); //构造来路
curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36’);
curl_setopt($ch,CURLOPT_cookie,’JSESSIONID=01F4964E4E2512FFE81320FED761B745;’);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //禁止调用时就输出获取到的数据
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($ch);
// echo $result ;
// $result = json_decode($result, true);
return $result;
}
- 3. 建立代理IP池
- 这个属于比较高级的。有些网站可能会使用特殊的手段,进行限制单位时间内,同一用户的爬取。这样会造成获取数据成本上升。这时候 就可以上IP池,通过全国各地的IP代理,模拟真实的用户IP访问。
- 4. 人工访问&&OCR识别
- 验证码是分别人机的一项很大的发明。但是随着OCR文字识别的发展。程序员设计的那些文字验证码,不管加了多少背景、扭曲度、混淆。再强大的OCR面前都不堪一击
- 二、防御
-
- 1. IP地址防御
- a.可以限制单用户的最高线程数,比如下载只能单线程下载。这样,要是遇到全站扫描比较有效
- b. 特殊页面,限制单页ip访问次数限制 : 比如登陆界面 只能提交10次数据
- c. IP地址辨析。可以把ip地址转为long类型,存到session中。防止别人盗取cookie,从别的电脑爬取
- d:ip应用场景分析。这个有经济条件的可以使用。通过网络接口查看,分析这个来源ip是否是机器人爬虫,非法ip、代理ip等。比如埃文科技,就有这种服务
- e:屏蔽地区。对于ban了n次ip,但是对方经常拨号换ip,对网站进行暴力破解。那么只能每次访问时,查询一下离线数据库的ip所在地,将该地区的ip全部屏蔽。
- 2. 接口数据加密
- post提交字段,多个字段相互有关联关系,比如username字段,那么可以加一个um_md5等加密字符串,服务器进行验证合法性。
- hide隐藏数据:提交表单的时候,内置一个hide字符串。提交的时候合并提交,服务端进行验证
- 加密字符串,当服务器返回数据的时候,提前在页面加一个加密的字符串,比如base64(time()); 这样在提交的时候可以解密字符串,用发送的时间和当前时间进行对比,超过5分钟,就ban掉
- 3、利用cookie
- 比如该接口提交时,必须登录,带有cookie
- 4、网站接口动态变化
- post提交的url 后面加一个&t=15029232 字段,或者登陆地址 动态变化
- 5. 网站代码加密
- a. 去掉注释,将html的所有注释
- b. 混淆,适用于js脚本。比如定义了function opurl() 函数,我们可以将opurl 改成a() 这样就会破解者造成很大的阅读代码成本
- c. 压缩代码:跟去掉注释一样
- 这种功能网上好多,只要搜索代码混淆加密即可
- 6. 验证码
- 不要用文字验证码。如果实在没发,那么验证码验证过一次后,必须清除Session中的验证码。防止暴力破解
- 采用拖拽移位的验证码:比如本网站的极验证的验证码。因为这种验证码做的是连线题。不是单纯的单选题。所以破解难度上升的N被
- 问题验证码: 比如展示图片 询问加减法, 常识问题回答