1

我无法验证wp_create_nonce()在隐藏输入中创建的随机数,其名称为 html 表单中的随机数:

<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'). 这反过来调用wp_verify_nonce($nonce,$action)which 通过散列相同的变量并比较两者来验证随机数。

逆向工程定位问题
我的问题是wp_create_nonce('action_name')使用正确的用户 ID 创建。但是,当我运行check_ajax_referer('action_name','nonce')which 调用wp_verify_nonce($nonce,$action)which 又调用wp_get_current_user(); 未找到用户(用户 ID 为 0)。

证据问题与用户 ID 有关

如果我临时编辑wp-includes/pluggable.php以强制使用我的用户 ID,则 nonce 验证工作正常。就好像对已知且有效的端点的 ajax 请求被视为用户已注销,无论他们是否注销。

我显然在这里遗漏了一些东西,但我不知道是什么。

4

1 回答 1

0

发生这种情况是因为服务器没有将带有操作wp_rest的单独 nonce发送到客户端,并且不会在每个 REST 请求中通过名为X-WP-Nonce的 HTTP 请求标头从客户端接收回来。

为了让它工作,你必须生成一个像这样的随机数:

wp_create_nonce('wp_rest')

...并将其提供给拨打其余电话的客户。一旦您的客户端具有 nonce 值,您需要将其添加到每个 REST 请求中,例如:

headers: {
    'X-WP-Nonce': nonce,
}

在服务器上创建 nonce 并在客户端上访问它可以通过多种方式完成。使用wp_localize_script()是 WordPress 最常见且可能是最佳实践。wp_localize_script()将全局变量添加到客户端以供脚本访问。请参阅https://developer.wordpress.org/reference/functions/wp_localize_script/

于 2020-09-25T13:45:53.657 回答