问题描述
我无法验证以wp_create_nonce()
创建的随机数(在HTML形式的名称为 nonce 的隐藏输入中)
<input type="hidden" name="nonce" value="<?php echo wp_create_nonce('action_name'); ?>" />
表单提交是通过ajax完成的,并通过check_ajax_referer('action_name','nonce')
进行了验证。这总是返回-1
。所有REST端点均已经过测试,没有随机数,并且可以100%正常工作。
该问题似乎源于wp的用户标识。
我到目前为止的调试
立即创建
在 wp-includes / pluggable.php wp_create_nonce('action_name')
中,创建一个随机数散列,该散列对各种变量(包括用户ID和操作)进行哈希处理。
Ajax调用
我提交了一个调用check_ajax_referer('action_name','nonce')
的ajax调用。依次调用wp_verify_nonce($nonce,$action)
,该哈希通过对相同的变量进行散列并比较两者来验证现时。
通过逆向工程定位问题
我的问题是使用正确的用户ID创建了wp_create_nonce('action_name')
。但是,当我运行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 的随机数发送到客户端,也没有通过名为 X-WP-每个REST请求都立即使用。
要使此功能正常运行,您将必须生成一个像这样的随机数:
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/。