WordPress防Spam

什么事Spam

Spam翻译过来就是:垃圾邮件,短信的意思,那么对于WP来说,如果你的网站内有大量的Spam,大概率是两种情况:

  1. 垃圾评论是在太多,处理不过来了
  2. 本来就没啥人气,有点垃圾评论还能安慰安慰自己

使用我给出了下面这些解决方案:

1.WP评论开启审核和关键字黑名单

在 WordPress 后台 Settings > Discussion Settings 有两个输入框, 一个是评论审核, 一个是评论黑名单. 每行一词, 只要评论者名称或者内容出现这些关键字就会进行相应的处理.

这是个非常强大的功能, 因为它的过滤是 100% 成功的. 比如: 现在挂名搞 SEO 的喜欢发 spam, 评论时会用 XX市SEO, XX州SEO 这样的名称, 所以我将 市seo, 州seo 写进了黑名单.

计算前端处理时间

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

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

时间戳

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

禁止评论中附带链接

很多年前阿瓦受人肉spam烦扰之后的做法: 将评论中所有链接去除. 目的应该是打消 Spammer 的积极性. 但在评论中还是有 spam, 因为作为低成本的 spammer, 或者根本就不会花时间去考虑是否值得发这个垃圾评论, 因为发布时间远小于去评估一个发布价值的时间.

这是多年前的做法, 或许那时没有更好的方法, 不得已而为之. 目前来看, 最好不要使用这个方法, 因为你不知道有多少人真的是为了发布者昵称上的链接而发一个评论, 而这个评论可能是有意义的, 应该保留这种积极性.

用户登录后才有权限评论

Denis 三年前跟我说, 他要求访客登录方可留评, 而用户可以通过 Twitter 或者微博登录他的博客.

当时我震惊了, 这不是等于自宫吗? 对于防 Spam, 或许用处不大, 对于那些人肉 Spam, 只是门槛高了点而已. 但会失去很多有用的评论. 而事实上, 这是个好方法, 通过微博登录博客的很多访客成为了 Denis 微博上的粉丝. 虽然博客看似冷清了, 但与读者的联系更加紧密了.

墙是我使用php实现的小工具,

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

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

使用方法也很简单, 拷贝到 function.php 文件最后即可. 其中 wall 是隐藏关键字, 有需要的请自行更改 (不改也可以).

class anti_spam {    
    // 构造函数    
    function __construct() {    
        if ( !current_user_can('level_0') ) {    
            add_action('template_redirect', array($this, 'modify_comment_form'), 1);    
            add_action('init', array($this, 'check_spam_submission'), 1);    
            add_action('preprocess_comment', array($this, 'handle_spam_comment'), 1);    
        }    
    }    
     
    // 设置字段    
    function modify_comment_form() {    
        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 check_spam_submission() {    
        ( !empty($_POST['wall']) && empty($_POST['comment']) ) ? $_POST['comment'] = $_POST['wall'] : $_POST['spam_confirmed'] = 1;    
    }    
     
    // 处理    
    function handle_spam_comment( $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();
© 版权声明
THE END
点赞414 分享
和此文作者聊聊 抢沙发

    暂无评论内容