WordPress 的站点,垃圾评论删都删不完,确实很烦人。一天几百条感觉都要把数据撑爆了,那么有什么方法能够防御这些垃圾评论呢?今天我给大家分享一个利用 wp_create_nonce 实现 WordPress 屏蔽垃圾评论的方法。
WordPress 中提交评论的文件主要是根目录下面的 wp-comments-post.php 文件,垃圾评论也是从这里进去的。这个页面的防御性比较低,只是一些比较基础的数据判断,这就给那些垃圾评论软件有了可乘之机。
一般的垃圾评论可以通过他们固有的 POST 请求工具,就可以轻轻松松的发布 N 条垃圾评论,比如下面的代码:
$url = "https://www.cdsy.com.cn/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 请求中。