WordPress正在以登录用户的身份创建随机数,但验证错误

时间:2020-09-18 作者:dewd

验证用创建的nonce时遇到问题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端点都已在没有nonce的情况下进行了测试,并且工作完全正常。

这个问题似乎源于wp的用户识别

My debugging so far

<在wp包括/可插拔的范围内创建临时文件。phpwp_create_nonce(\'action_name\') 创建一个nonce散列各种变量,包括用户id和操作。

Ajax调用
我提交了一个Ajax调用check_ajax_referer(\'action_name\',\'nonce\'). 这依次调用wp_verify_nonce($nonce,$action) 它通过散列相同的变量并比较两者来验证nonce。

逆向工程来定位问题我的问题是wp_create_nonce(\'action_name\') 正在使用正确的用户id创建。但是,当我运行check_ajax_referer(\'action_name\',\'nonce\') 哪个呼叫wp_verify_nonce($nonce,$action) 依次调用wp_get_current_user(); 找不到用户(用户id为0)。

Evidence the problem is to do with user id

如果我临时编辑wp includes/pluggable。为了强制使用我的用户id,nonce验证工作正常。这就好像对已知有效端点的ajax请求被视为用户已注销,而不管用户是否已注销。

很明显,我遗漏了一些东西,但我不知道是什么。

如果有帮助,这就是REST点注册。如前所述,它工作正常,无需临时人员参与。

    register_rest_route(
        \'my-namespace\', //namespace
        \'my-namespace-route-1\', //route
        [\'methods\'=>\'POST\',
         \'callback\'=>[\'Another_Class\',//class
             \'a_static_function\'] //static function
        ] //params
    );

1 个回复
最合适的回答,由SO网友:dewd 整理而成

之所以会发生这种情况,是因为该操作有一个单独的noncewp_rest 不是由服务器发送到客户端,而是在名为X-WP-Nonce 每一个休息请求。

要使其正常工作,必须生成如下所示的nonce:

wp_create_nonce(\'wp_rest\')
。。。并将其提供给拨打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/.

相关推荐

如何在WordPress中用AJAX请求更改PHP变量

我有一个带有选择框的html表单,我想根据用户的选择显示不同的数据。我真正需要做的就是根据选择在php中更改1个变量。我进行了一个外部API调用,返回数据并将其显示在html表中。我想根据用户的选择更改api调用的一小部分(get uri中的id)。有没有简单的方法可以做到这一点?我已经完成了jquery并使用wordpress将其排队,当更改select box值时,我得到了200个响应。但我似乎无法更改PHP。为了避免代码轰炸,我修改了回调函数,以给出一个我希望发生的示例。非常感谢您的反馈。谢谢HTM