垃圾评论是指的是未经授权,人们不想看见的评论,现在很多博客都存在spam的足迹,甚至有互相依存的关系。据本人调查, 那些还有人管的博客中,满布spam而没有清理主要有两个原因:
1.垃圾评论实在太多,处理应接不暇。
2.评论数本来就少,这样看起来更有人气,不舍得删除。
作为负责任的站长,不应该对spam手软。对于第二种情况,可怜又可恨,我无力吐槽。而有心要清理spam的朋友,还是有很多事情可以做的。本文将介绍几种防spam的工具和方法。
WordPress 垃圾评论
WordPress 自带防spam 插件:Akismet
WordPress自带的spam过滤插件Akismet,非常强大,可以过滤掉大部分垃圾评论。
Akismet会对评论者和评论内容的关键字,评论者邮箱,链接地址做判断,确定是否要将评论列为待审批对象。 对所有 spam 类型都适用,但是会有很多漏网的spam.
WordPress 评论审核和黑名单
在 WordPress 后台 Settings > Discussion Settings 有两个输入框, 一个是评论审核, 一个是评论黑名单。 每行一词, 只要评论者名称或者内容出现这些关键字就会进行相应的处理。
这是个非常强大的功能,因为它的过滤是100%成功的。比如:现在挂名搞 SEO 的喜欢发spam,评论时会用 XX市SEO, XX州SEO这样的名称,所以我将 市seo,州seo 写进了黑名单。
以下是我的评论审核和评论黑名单关键字列表:
1.评论审核 (备用链接)
2.评论黑名单 (备用链接)
小墙
Willin Kan写的小墙工具,理论上可以100% 屏蔽机器人发出的 spam. 如果是自然人提交评论,小墙会在评论提交表单中加一个hidden变量, 如果后台检测不到这个变量,则认定为spam,可以选择需要审核, 也可以直接过滤掉。
如果对方知道你用的 hidden 变量或者使用虚拟点击, 就可以破掉小墙。但是 spam 本来就是小成本和以量取胜的事情, 除非与你与spammer 结仇了,我相信人家不会那么无聊来破你小墙。 而且机器人 spam 的数量占了绝大多数, 这个工具很有必要。
貌似Willin 现在不用WordPress 了,网站也正在维护,小墙代码我就贴在下面。使用方法很简单, 拷贝到 function.php 文件最后即可。 其中wall 是隐藏关键字,有需要的请自行更改 (不改也可以)。
class anti_spam {
//建立
function anti_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);
}
}
//設欄位
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\"></textarea>",$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'], array('pingback', 'trackback') );
if(!$is_ping) {
die();
}
}
return $comment;
}
}
$anti_spam = new anti_spam();
计算前端处理时间
在输入框上方用 JavaScript 取一个时间戳作为全局变量,在提交表单的时候获取提交时间,两个时间相减,如果小于可能值,则视为机器人。判断为机器人的评论你可以按小墙的方式处理,也可以不处理 (不占用服务器资源,但不能记录 spam 信息)。
相对与小墙,这种方法更加可靠,但绝不是没有漏洞,只要spammer做个setTimeout延迟发布就破了。
时间戳
老掉牙的方机器人方法, 很实用, 但有最大的缺点: 用户体验不好。 要求访客多填一个很难观察的数字, 严重打压评论者积极性。WordPress 平台有很多这类插件可以用, 但我是不建议使用的。
消灭所有评论中的链接
很多年前阿瓦受人肉 spam 烦扰之后的做法: 将评论中所有链接去除。 目的应该是打消 Spammer 的积极性。 但在评论中还是有 spam, 因为作为低成本的 spammer, 或者根本就不会花时间去考虑是否值得发这个垃圾评论, 因为发布时间远小于去评估一个发布价值的时间。
这是多年前的做法, 或许那时没有更好的方法, 不得已而为之。 目前来看, 最好不要使用这个方法, 因为你不知道有多少人真的是为了发布者昵称上的链接而发一个评论, 而这个评论可能是有意义的, 应该保留这种积极性。