利用 wp_create_nonce 实现 WordPress 屏蔽垃圾评论

发布于 2018-08-02 字数2851 浏览 861 评论 0

WordPress 的站点,垃圾评论删都删不完,确实很烦人。一天几百条感觉都要把数据撑爆了,那么有什么方法能够防御这些垃圾评论呢?今天我给大家分享一个利用 wp_create_nonce 实现 WordPress 屏蔽垃圾评论的方法。

垃圾评论的来源

WordPress 中提交评论的文件主要是根目录下面的 wp-comments-post.php 文件,垃圾评论也是从这里进去的。这个页面的防御性比较低,只是一些比较基础的数据判断,这就给那些垃圾评论软件有了可乘之机。

一般的垃圾评论可以通过他们固有的 POST 请求工具,就可以轻轻松松的发布 N 条垃圾评论,比如下面的代码:

$url = "http://www.wenjiangs.com/wp-comments-post.php";
$args = array(
'body' => array(
    'comment_post_ID' => '29',
    'author' => rand(),
    'email' => rand().'@'.rand().'.cc',
    'url' => '',
    'comment' => '这是一条垃圾评论'.rand(),
),
);
//提交评论
$res = wp_remote_post($url, $args);
if($res['response']['code']==404){
    echo "POST评论成功!";
}else{
    echo $res["body"];
}

屏蔽垃圾评论的方法

验证提交用户是否合法,是最控制评论源头的重要方式。比如评论都必须额外提交一个参数 a,其中参数 a 的值为 1,否则就拒绝评论。这个特点就很像用户评论必须提交密码才能评论。但是这个密码有个缺点,那就是所有的人都知道它的值是 1,也就没法达到正常验证的目的。如果能够生成一个随机的字符串,且每一个客户端都不一致,并且可以验证正确性,那么这才是真正的密码了。

幸好的是,强大的 WordPress 已经有这个功能了,wp_create_nonce()可以生成一个随机的字符串,官方是这样描述的:

Generates and returns a nonce. The nonce is generated based on the current time, the $action argument, and the current user ID.

比如根据评论的文章 ID 来生成一个随机值,wp_create_nonce(post_ID) 生成 fc7c5ef6f3

生成评论随机值

一般主题都使用的是 WordPress 原生的 comment_form 函数,可以通过钩子生成这个随机值:

add_action("comment_form_top","wenshuo_comment_form_top");
function wenshuo_comment_form_top(){
    global $post;
    $nonce=wp_create_nonce($post->ID);
    echo '<input type="hidden" name="comment_nonce" value="'.$nonce.'" />';
}

这样的话,就会在评论表单里生成一个隐藏的 input,并且 input 的值是一个随机值

验证评论随机值

生成了随机值,然后就可以在评论提交之后进行判断:

add_action('preprocess_comment','wenshuo_preprocess_comment');
function wenshuo_preprocess_comment($commentdata){
    $comment_post_ID=$commentdata["comment_post_ID"];
    $nonce=wp_create_nonce($comment_post_ID);
    if(!isset($_POST["comment_nonce"]) || $_POST["comment_nonce"]!==$nonce){
        wp_die("请勿恶意评论!");
    }
}

上述代码就起到了防御评论的目的,如果用户没有提交随机值或者随机值不正确,那么它的评论就可以拒之门外。对那些评论发布机器来说,更是一个噩梦。

wp_create_nonce 是个很大的函数,它不仅可以用在评论的请求,甚至也可以用在 WordPress 里的任何 get、post 请求中。

如果你对这篇文章有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助。

扫码二维码加入Web技术交流群

您暂时不能评论!

管理员开启了需要登录才能够评论,你可以免费注册一个本站的账号。

还没有评论!

目前还没有任何评论,快来抢沙发吧!