WordPress Nonces 是 WordPress 生成的仅单次使用 token,来帮助保护 URL 和表单被滥用;
如果 WordPress 主题允许提交数据,那么,使用 nonces 可以用于验证用户行为,并且对于保护站点防御 CSRF ( 跨站请求伪造)至关重要;
创建 Nonce 的方式
- wp_nonce_url() – 在 URL 中添加 nonce。
- wp_nonce_field() – 在 form (表单) 中添加 nonce。
- wp_create_nonce() – 自定义使用方式,多用于保护 Ajax 请求。
验证 Nonce
- check_admin_referer() – 在管理界面验证 URL 或者表单传递的 nonce 。
- check_ajax_referer() – 验证 Ajax 传递的 nonce,如果验证失败,则默认停止执行脚本。
- wp_verify_nonce() – 验证在其他上下文中传递的nonce 。
Ajax 请求 nonce 验证
本文在上一篇文章 《WordPress 主题使用 Fetch API 实现文章点赞》的基础上添加 nonce 验证代码;
第一步 创建 nonce
在 functions.php 中创建 nonce;
/**
* 创建 nonce
*
* @author 智慧宫
* @link https://lerm.net
*/
wp_enqueue_script( 'lerm_js', LERM_URI . 'assets/js/lerm.js', array(), LERM_VERSION, true );
wp_localize_script(
'lerm_js',
'adminajax',
array(
'url' => admin_url( 'admin-ajax.php' ),
// 创建 nonce。
'nonce' => wp_create_nonce( 'post_like_nonce' ),
)
);
第二步 在JS 函数中添加nonce字段
FormData
使用append()
方法 添加一个新值到 FormData
对象内的一个已存在的键中,如果键不存在则会添加该键。
/**
* FormData 添加键值对
*
* @author 智慧宫
* @link https://lerm.net
*/
params.append("security", adminajax.nonce);
第三步 在Ajax 处理函数中验证 nonce
在 functions.php 中的 Ajax 处理函数中最添加如下代码;其中'security'
为js中设定的formData的键名;'ajax_nonce'
是在wp_create_nonce( 'ajax_nonce' )
中的action;
/**
* 验证 Ajax 提交的nonce;
*
* @author 智慧宫
* @link https://lerm.net
*/
check_ajax_referer( 'post_like_nonce', 'security', );
由于站长水平有限,以上代码仅供参考,若有更好的方案,请大家留言评论。
参考资料
check_ajax_referer()
—— WordPress Developer ResourcesformData.append()
—— MDN教程wp_create_nonce()
—— WordPress Developer Resources- Using Nonces