修改PHP脚本使WordPress拦截垃圾评论的方法示例

拦截英文垃圾评论

由于绝大多数的垃圾评论都是英文的,所以国内不少朋友在使用 Some Chinese Please 插件,它可以有效地拦截内容中不带有中文字的comment和trackback(pingback),不写入数据库中,可有效地减小spam对blog服务器的无谓使用。虽然已经 2 年多没有更新,但还是可用的。

其实还可以简化下,直接将下面的代码添加主题的 functions.PHP 文件效果与使用 Some Chinese Please 插件相同:

rush:PHP;"> /* refused spam */ function refused_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');

@Teddysun http://teddysun.com/ 经过实测反馈,wordpress中并没有err这个函数(这个函数也许是存在于 @知更鸟 的主题里)。因此不会有提示信息出现。最好还是用wp_die函数,这样就会有提示信息。所以,上面的代码如果不生效,可以使用以下代码

rush:PHP;"> /* refused spam */ function refused_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文件添加

rush:plain;"> Order Deny,Allow Deny from xxx.xxx.xxx.xx Deny from xxx.xxx.xxx.xx

拦截中文垃圾评论

如果发现大量垃圾评论中文,那么可以用写的小墙工具,理论上可以 100% 屏蔽机器人发出的 spam. 如果是自然人提交评论,小墙会在评论提交表单中加一个 hidden 变量,如果后台检测不到这个变量,则认定为 spam,可以选择需要审核,也可以直接过滤掉.

如果对方知道你用的 hidden 变量或者使用虚拟点击,就可以破掉小墙. 但是 spam 本来就是小成本和以量取胜的事情,除非与你与 spammer 结仇了,我相信人家不会那么无聊来破你小墙. 而且机器人 spam 的数量占了绝大多数,这个工具很有必要.

貌似 Willin 现在不用 wordpress 了,网站也正在维护,小墙代码我就贴在下面. 使用方法很简单,拷贝到 function.PHP 文件最后即可. 其中 wall 是隐藏关键字,有需要的请自行更改 (不改也可以).

//設欄位
function w_tb() {
if ( is_singular() ) {
ob_start(create_function('$input','return preg_replace("#textarea(.*?)name=([\"\'])comment([\"\'])(.+)/textarea>#","textarea$1name=$2wall$3$4/textarea><textarea name=\"comment\" cols=\"50\" rows=\"4\" style=\"display:none\">",$input);') );
}
}

//檢查
function gate() {
( !empty($_POST['wall']) && empty($_POST['comment']) ) ? $_POST['comment'] = $_POST['wall'] : $_POST['spam_confirmed'] = 1;
}

//處理
function sink( $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'],'trackback') );
if(!$is_ping) {
die();
}
}
return $comment;
}
}
new anti_spam();

计算前端处理时间

在输入框上方用 JavaScript 取一个时间戳作为全局变量,在提交表单的时候获取提交时间,两个时间相减,如果小于可能值,则视为机器人. 判断为机器人的评论你可以按小墙的方式处理,也可以不处理 (不占用服务器资源,但不能记录 spam 信息).

相对与小墙,这种方法更加可靠,但绝不是没有漏洞,只要 spammer 做个 setTimeout 延迟发布就破了.

时间戳

老掉牙的方机器人方法,很实用,但有最大的缺点: 用户体验不好. 要求访客多填一个很难观察的数字,严重打压评论者积极性. wordpress 平台有很多这类插件可以用,但我是不建议使用的.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...