每一个 CMS 系统,用户一旦多起来,垃圾评论就随之而来了,反垃圾评论是 CMS 开发中的一项必不可少的工作,WordPress 官方专门开发了垃圾评论拦截的插件 Akismet,基本上可以拦截绝大多数垃圾评论了。对于不想使用插件的用户,今天我们来介绍一种,简单高效的方法。
什么是 wp_create_nonce?
wp_create_nonce 是 WordPress 跟据“当前时间、$action 参数、和当前用户 id“生成随机字符串的函数,提交表单时,WordPress 会对这个随机字符串进行验证,如果提交的字符串相同,则证明本次提交是合法的提交。如下,我们添加一个名为 comment_nonce 的随机字符串到评论表单。
添加评论nonce到评论表单
复制add_action(comment_form_top, function ()
{
global $post;
$nonce = wp_create_nonce($post->ID); //生成nonce
echo '';
});
垃圾评论是怎么来的?
网络上大部分垃圾评论是通过软件模拟提交评论产生的,垃圾评论软件通过模拟 WordPress 的评论数据(也就是昵称、邮箱、网址、评论这些数据),提交到 WordPress。因为是软件操作的,提交评论的效率非常高,往往每分钟能达到成百上千条。
怎么通过 wp nonce 防止垃圾评论
垃圾评论软件提交的评论数据都是实现准备好的,其他的数据都可以事先写好,但是,因为 comment_nonce 这个数据是随机生成的数据,是没办法事先写好的。处理评论提交的时候,我们验证这个随机数据就可以了,如果验证通过,说明是正常的评论,否则就可以认为是垃圾评论,直接丢掉提交过来的评论数据就可以了。
用户发表评论时,处理评论数据,验证随机数。
复制add_action('preprocess_comment', function ($commentdata)
{
$comment_post_ID = $commentdata[ 'comment_post_ID' ];
$comment_content = $commentdata[ 'comment_content' ];
//检查comment_nonce
$nonce = $_POST[ 'comment_nonce' ];
if ( ! isset($_POST[ 'comment_nonce' ]) || ! wp_verify_nonce($nonce, $comment_post_ID)) {
wp_die( 'You are robot?' );
}
$comment_content = strip_tags($comment_content); //过滤html标签
return $commentdata;
});
本功能我们使用了 wp_create_nonce
和 wp_verify_nonce
这两个 WordPress 函数,除了评论,你还可以在其他需要提交表单地方使用这个方法来验证合法提交,过滤非法提交,从而保证 WordPress 站点的安全。