WEB安全之垃圾信息防御措施
防止垃圾评论与机器人的攻击手段如下:
1)IP限制。其原理在于IP难以伪造。即使是对于拨号用户,虽然IP可变,但这也会大大增加共攻击的工作量。
2)验证码。其重点是让验证码难于识别,对于“字母+数字”的验证码,关键在于形变与重叠,增加其破解中切割和字模比对的难度,人眼尚且难以辨识,机器就更难处理了,再者是加大对于验证码的猜测难度。
3)Token和表单欺骗。通过加入隐藏的表单值或者故意对程序混淆表单值
4)审核机制。加大了管理人员的工作量,但理论上可以完全阻止垃圾评论,这是最无奈也是最有效的策略。
1.IP限制
HTTP协议是透明的、公开的,服务器端根本无法区分来源是真实的提交还是伪造的。所以通过判断Referer等手段是于事无补的,但是HTTP也有自己的局限。由于HTTP协议是应用层的协议,是基于TCP/IP协议的。
IP在TCP层传递,其传输需要通过TCP的“三次握手”。这个握手的过程中,有一个校验过程,因此IP是很难伪造的。而HTTP层属于顶层,无法控制IP,所以最简单有效的办法就是对IP进行限制。
但是,不少代码会判断HTTP头的HTTP_X_FORWARDED是否是代理过来的,若是,则把其记为IP。但是,HTTP_X_FORWARDED来自于HTTP请求中的X Forwareded For报头,而这个报头是可以修改的。这就可能造成潜在的攻击。所以合理的判断是完全不考虑代理,而使用SERVER变量中的HTTP_CLIENT_IP或REMOTE_ADDR。二者难以伪造。出于安全考虑,凡是通过代理过来的请求或者HTTP头中包含XForwareded For报头的,很多程序采取了拒绝的方案。这种处理方式比较简单,误差也比较小。
2.Token法
要防止攻击的关键在于加大攻击的难度。最简单的是放一个隐藏可变的Token,每次提交都需要和服务器校对,若通不过,则为外部提交。
下面的代码称为Token法
<?php define('SECRET','67%$#ap28'); function m_token() { $str = mt_rand(1000,9999); $str2 = dechex($_SERVER['REQUEST_TIME'] - $str); return $str.substr(md5($str.SECRET), 0, 10).$str2; } echo m_token(); echo '<br />'; /** * @param $str * @param int $delay 表示时间延迟,在不同的程序根据业务来自行修改 */ function v_token($str,$delay=300) { $rs = substr($str, 0, 4); $middle = substr($str, 0, 14); $rs2 = substr($str, 14, 8 ); return ($middle == $rs.substr(md5($rs.SECRET), 0, 10)) && ($_SERVER['REQUEST_TIME'] - hexdec($rs2) - $rs<$delay); } var_dump(v_token(m_token()));
3.验证码
对于预防一些灌水机器人,主要采取验证码一类的措施,包括中文验证码、回答验证,但是对于这两点,专业的灌水机器 人都可以突破。但是对于技术含量不高的,可以直到一定的阻止作用,同时也降低了用户体验。
灌水机器 人通常都会抓取页面的FROM表单,分析必填荐与非必填项,对于必填项构造请求。如果存在普通的图形验证码,则启用图形识别模块、破解验证码、构造完整的数据包。对此可以建立一个INPUT,用CSS或者间接通过JavaScript设其页面为不可见,如果服务器收到的数据包含有这个控件的值,那么肯定是来自机器提交。这样也能起到一定的效果。另外,对INPUT的值进行欺骗对博客的垃圾评论能起到一定的作用
用户名:或者可以做成图片附上机器的学习。
<input type="text" name="email" />实际上代表用户名。
<input type="text" name="url" />实际上是E-mail
<input type="text" name="author" />实际上是URL,而且是隐藏的不能有任何输入的字段。
在服务器端,如果$_POST['email']匹配的是一个电子邮件地址,那么一定是灌水机器人。如果atuthor字段有值,那么其也一定是灌水机器人。这叫做机器学习欺骗。
同理,可以定期变更action的提交地址,加大灌水机器人的学习难度,也可以把所有数据改为后台审核。
但是,经过灌水机器 的学习和模型修改,过一段时间必将卷土重来。阻止外部提交一直是个难题。对于表单,因为它是可见的,所以很难阻止机器的猜解和模拟。目前,可行的办法就是使用Active控件。主要是IE Only和技术难度高,大多数的网站无法使用这样的技术,特别是个人站点。
使用JavaScript进行加密验证和平衡图形验证码,可以阻止99%的外部提交。腾讯的大部分产品都使用了这种技术,比如微博和邮箱。