代码说

code is poetry

代码说    
碎碎念:下雨天留客天留人不留  换一换

简单的反垃圾评论脚本

作者:coderzheng 发布于:2015-10-30 1:43 Friday 分类:php  阅读模式

之前站点被垃圾评论脚本不停地爬,虽然程序经过了几次调整,已经能比较好地与自动脚本进行对抗。
但是还是有机器人不厌其烦地过来爬呀:

可以看到,垃圾评论的时间差已经被明显拉大了。但是仍然无法确知这个主机地址上的脚本是怎么绕过动态验证码这道关卡的。似乎只有可能是人为填写进去的。如果不是,那就必须有识别图片中验证码的程序在运行,但是我已经对站点中的验证码做了改造,想要突破干扰线可不是件简单的事情。
言归正传,这篇文章讲的是反垃圾评论。直接贴核心代码:
require_once EMLOG_ROOT.'/blacklist.php';
$ipaddr = getIp();
$index = strrpos($ipaddr, '.');
$needle = substr($ipaddr, 0, $index);
$bool = 0;
if ( in_array($ipaddr, $blacklist['static']) ) {
    $bool = 1;
}
foreach ($blacklist['variable'] as $v) {
    if ( FALSE !== strpos($v, $needle) ) {
      $bool = 1;
      break;
    }
}
上面这段代码首先引用了一个定义黑名单的php配置文件,然后将客户端的ip与黑名单中的ip进行比对。这里有必要再贴一下blacklist.php的代码:
<?php
$blacklist = array(
'static'=> array('112.90.236.42',),
'variable' => array('46.151.52.*',),
);
static是指静态IP,variable是指动态IP(在某个IP地址段上)。继续分析之前的代码:实际上就是将客户端的IP地址与黑名单中的所有地址进行匹配,只不过静态地址和动态地址的匹配方法有所不同而已。将上面的代码封装成函数,放进Comment_Model这个类中,并且在addComment和replyComment这两个方法中调用就可以了。
PS:这篇文章只是对IP地址进行了简单的过滤,实际上如果对blacklist数组进行扩展,是可以增加一个子数组ban_words来过滤一些敏感词汇的。但是这里涉及到一个中文分词,不能简单地用strpos这个方法去检测评论中是否包含某个敏感字符串,因为中文是可以根据不同的语境进行不同的断字的;此外之所以不将脚本做成插件,是因为使用插件的方式会影响程序的性能。不信你可以在WP站点里面装二三十个插件来试试,^^。

====================== 全文完 =======================

标签: emlog

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: 无法再见的时光  |  下一篇:简洁实用的分页类