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 请求中。