修改PHP脚本使WordPress拦截垃圾评论的方法示例
拦截英文垃圾评论
由于绝大多数的垃圾评论都是英文的,所以国内不少朋友在使用SomeChinesePlease插件,它可以有效地拦截内容中不带有中文字的comment和trackback(pingback),不写入数据库中,可有效地减小spam对blog服务器的无谓使用。虽然已经2年多没有更新,但还是可用的。
其实还可以简化下,直接将下面的代码添加到主题的functions.php文件,效果与使用SomeChinesePlease插件相同:
/*refusedspam*/
functionrefused_spam_comments($comment_data){
$pattern='/[一-龥]/u';
if(!preg_match($pattern,$comment_data['comment_content'])){
err('评论必须含中文!');
}
return($comment_data);
}
add_filter('preprocess_comment','refused_spam_comments');
@Teddysunhttp://teddysun.com/经过实测反馈,Wordpress中并没有err这个函数(这个函数也许是存在于@知更鸟的主题里)。因此不会有提示信息出现。最好还是用wp_die函数,这样就会有提示信息。所以,上面的代码如果不生效,可以使用以下代码:
/*refusedspam*/
functionrefused_spam_comments($comment_data){
$pattern='/[一-龥]/u';
if(!preg_match($pattern,$comment_data['comment_content'])){
wp_die('评论必须含中文!');
}
return($comment_data);
}
add_filter('preprocess_comment','refused_spam_comments');
针对那些使用技术手段,比如GET、POST等方式不填写前台表单,直接读取后台程序文件的spam,只有屏蔽IP才能缓解疯狗一样的攻势,其它什么验证码、滑动解锁等等都没用。
禁止某些IP访问
可以在.htaccess文件中添加:
OrderDeny,Allow Denyfromxxx.xxx.xxx.xx Denyfromxxx.xxx.xxx.xx
拦截中文垃圾评论
如果发现大量垃圾评论是中文,那么可以用WillinKan写的小墙工具,理论上可以100%屏蔽机器人发出的spam.如果是自然人提交评论,小墙会在评论提交表单中加一个hidden变量,如果后台检测不到这个变量,则认定为spam,可以选择需要审核,也可以直接过滤掉.
如果对方知道你用的hidden变量或者使用虚拟点击,就可以破掉小墙.但是spam本来就是小成本和以量取胜的事情,除非与你与spammer结仇了,我相信人家不会那么无聊来破你小墙.而且机器人spam的数量占了绝大多数,这个工具很有必要.
貌似Willin现在不用WordPress了,网站也正在维护,小墙代码我就贴在下面.使用方法很简单,拷贝到function.php文件最后即可.其中wall是隐藏关键字,有需要的请自行更改(不改也可以).
classanti_spam{
//建立
functionanti_spam(){
if(!current_user_can('level_0')){
add_action('template_redirect',array($this,'w_tb'),1);
add_action('init',array($this,'gate'),1);
add_action('preprocess_comment',array($this,'sink'),1);
}
}
//設欄位
functionw_tb(){
if(is_singular()){
ob_start(create_function('$input','returnpreg_replace("#textarea(.*?)name=([\"\'])comment([\"\'])(.+)/textarea>#",
"textarea$1name=$2wall$3$4/textarea><textareaname=\"comment\"cols=\"50\"rows=\"4\"style=\"display:none\"></textarea>",$input);'));
}
}
//檢查
functiongate(){
(!empty($_POST['wall'])&&empty($_POST['comment']))?$_POST['comment']=$_POST['wall']:$_POST['spam_confirmed']=1;
}
//處理
functionsink($comment){
if(!empty($_POST['spam_confirmed'])){
//方法一:直接擋掉,將die();前面兩斜線刪除即可.
//die();
//方法二:標記為spam,留在資料庫檢查是否誤判.
//add_filter('pre_comment_approved',create_function('','return"spam";'));
/*
$is_ping=in_array($comment['comment_type'],array('pingback','trackback'));
$comment['comment_content']=($is_ping)?
"◎這是Pingback/Trackback,小牆懷疑這可能是Spam!\n".$comment['comment_content']:
"[小牆判斷這是Spam!]\n".$comment['comment_content'];
*/
//MG12的處理方法
$is_ping=in_array($comment['comment_type'],array('pingback','trackback'));
if(!$is_ping){
die();
}
}
return$comment;
}
}
newanti_spam();
计算前端处理时间
在输入框上方用JavaScript取一个时间戳作为全局变量,在提交表单的时候获取提交时间,两个时间相减,如果小于可能值,则视为机器人.判断为机器人的评论你可以按小墙的方式处理,也可以不处理(不占用服务器资源,但不能记录spam信息).
相对与小墙,这种方法更加可靠,但绝不是没有漏洞,只要spammer做个setTimeout延迟发布就破了.
时间戳
老掉牙的方机器人方法,很实用,但有最大的缺点:用户体验不好.要求访客多填一个很难观察的数字,严重打压评论者积极性.WordPress平台有很多这类插件可以用,但我是不建议使用的.