WordPress 以登录用户身份创建随机数,但验证不正确
WordPress is creating nonce as a logged in user but verifying it incorrectly
我无法验证在隐藏输入中使用 wp_create_nonce()
创建的 nonce,其名称为 nonce,格式为 html:
<input type="hidden" name="nonce" value="<?php echo wp_create_nonce('action_name'); ?>" />
表单提交通过 ajax 完成并使用 check_ajax_referer('action_name','nonce')
验证。这总是 returns -1
。所有 REST 端点都在没有随机数的情况下进行了测试,并且可以 100% 正常工作。
这个问题似乎源于 wp 的用户身份。
到目前为止我的调试
Nonce 创建
在 wp-includes/pluggable.php wp_create_nonce('action_name')
中创建一个随机数哈希各种变量,包括用户 ID 和操作。
Ajax来电
我提交了一个调用 check_ajax_referer('action_name','nonce')
的 ajax 调用。这反过来调用 wp_verify_nonce($nonce,$action)
,它通过散列相同的变量并比较两者来验证随机数。
逆向工程定位问题
我的问题是 wp_create_nonce('action_name')
是用正确的用户 ID 创建的。但是,当我 运行 check_ajax_referer('action_name','nonce')
调用 wp_verify_nonce($nonce,$action)
又调用 wp_get_current_user()
时;未找到用户(用户 ID 为 0)。
证据表明问题与用户 ID
有关
如果我临时编辑 wp-includes/pluggable.php 以强制我的用户 ID,随机数验证工作正常。就好像 ajax 对已知且有效端点的请求被视为用户已注销,无论他们是否注销。
我显然在这里遗漏了一些东西,但我不知道是什么。
发生这种情况是因为带有操作 wp_rest 的单独随机数没有被服务器发送到客户端并在 HTTP 请求中从客户端接收回来header 为每个 REST 请求调用 X-WP-Nonce。
要使其正常工作,您必须生成这样的随机数:
wp_create_nonce('wp_rest')
...并将其提供给进行其余调用的客户。一旦您的客户端具有随机数值,您需要将其添加到每个 REST 请求中,例如:
headers: {
'X-WP-Nonce': nonce,
}
可以通过多种方式在服务器上创建随机数并在客户端访问它。使用 wp_localize_script()
是 WordPress 最常见且可能是最佳实践。 wp_localize_script()
向客户端添加一个全局变量以供脚本访问。参见 https://developer.wordpress.org/reference/functions/wp_localize_script/。
我无法验证在隐藏输入中使用 wp_create_nonce()
创建的 nonce,其名称为 nonce,格式为 html:
<input type="hidden" name="nonce" value="<?php echo wp_create_nonce('action_name'); ?>" />
表单提交通过 ajax 完成并使用 check_ajax_referer('action_name','nonce')
验证。这总是 returns -1
。所有 REST 端点都在没有随机数的情况下进行了测试,并且可以 100% 正常工作。
这个问题似乎源于 wp 的用户身份。
到目前为止我的调试
Nonce 创建
在 wp-includes/pluggable.php wp_create_nonce('action_name')
中创建一个随机数哈希各种变量,包括用户 ID 和操作。
Ajax来电
我提交了一个调用 check_ajax_referer('action_name','nonce')
的 ajax 调用。这反过来调用 wp_verify_nonce($nonce,$action)
,它通过散列相同的变量并比较两者来验证随机数。
逆向工程定位问题
我的问题是 wp_create_nonce('action_name')
是用正确的用户 ID 创建的。但是,当我 运行 check_ajax_referer('action_name','nonce')
调用 wp_verify_nonce($nonce,$action)
又调用 wp_get_current_user()
时;未找到用户(用户 ID 为 0)。
证据表明问题与用户 ID
有关如果我临时编辑 wp-includes/pluggable.php 以强制我的用户 ID,随机数验证工作正常。就好像 ajax 对已知且有效端点的请求被视为用户已注销,无论他们是否注销。
我显然在这里遗漏了一些东西,但我不知道是什么。
发生这种情况是因为带有操作 wp_rest 的单独随机数没有被服务器发送到客户端并在 HTTP 请求中从客户端接收回来header 为每个 REST 请求调用 X-WP-Nonce。
要使其正常工作,您必须生成这样的随机数:
wp_create_nonce('wp_rest')
...并将其提供给进行其余调用的客户。一旦您的客户端具有随机数值,您需要将其添加到每个 REST 请求中,例如:
headers: {
'X-WP-Nonce': nonce,
}
可以通过多种方式在服务器上创建随机数并在客户端访问它。使用 wp_localize_script()
是 WordPress 最常见且可能是最佳实践。 wp_localize_script()
向客户端添加一个全局变量以供脚本访问。参见 https://developer.wordpress.org/reference/functions/wp_localize_script/。