修改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平台有很多这类插件可以用,但我是不建议使用的.