WordPress 使用 Nonces 验证Ajax 请求,防止CSRF攻击

WordPress Nonces 是 WordPress 生成的仅单次使用 token,来帮助保护 URL 和表单被滥用;

如果 WordPress 主题允许提交数据,那么,使用 nonces 可以用于验证用户行为,并且对于保护站点防御 CSRF ( 跨站请求伪造)至关重要;

Ajax Nonces

创建 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', );

由于站长水平有限,以上代码仅供参考,若有更好的方案,请大家留言评论。

参考资料

  1. check_ajax_referer()—— WordPress Developer Resources
  2. formData.append() —— MDN教程
  3. wp_create_nonce() —— WordPress Developer Resources
  4. Using Nonces

Leave a Reply

VisitorWelcome