Ron*_*ers 4 php rest wordpress nonce
我有一个应该是安全的应用程序,因此使用了Nonce,但是我无法使它们正常工作。我尝试了几种方法,但由于验证不起作用,显然缺少了一些内容。
我的js代码片段是:
function placeNew(next){
_nonce = $('input#_nonce').val();
request = $.ajax({
type: 'POST',
url: url_path + '/foo/v1/newbee',
data: {bid : next , _nonce : _nonce},
security: '<?php echo wp_create_nonce( "a" ); ?>',
dataType: 'json'
});
request.done(function (response, textStatus, jqXHR){
str = JSON.stringify(response);
if(response["error"]){
alert(response["message"]);
}
Run Code Online (Sandbox Code Playgroud)
使用以下代码将现时值添加到页面:
$nonce = wp_create_nonce( 'a' );
echo "<input type='hidden' id='_nonce' value=" . $nonce ."/>";
Run Code Online (Sandbox Code Playgroud)
在php中,以下函数片段用于获取和比较随机数:
function ace($request) {
global $wpdb;
$timestamp = time();
$nonce = (string) $request['_nonce'];
$verify = check_ajax_referer( 'a', $nonce, false );
if ( ! $verify){
$errMsg = $nonce . '-'. $verify .' not validated ';
return (object) array(error => true, message => $errMsg);
}
Run Code Online (Sandbox Code Playgroud)
我总是收到“未验证”消息。$ nonce有值,但$ verify永远不会有值。
根据文档:
对于提出手动Ajax请求的开发人员,将需要随每个请求传递随机数。API使用操作数设置为wp_rest的随机数。然后,可以通过_wpnonce数据参数(POST数据或在GET请求的查询中)或通过X-WP-Nonce标头将它们传递给API。
您缺少的重要部分是:
API使用操作数设置为wp_rest的随机数。
为了使其正常工作,您必须在wp_create_nonceto中命名您的操作wp_rest。
因此,对于您的代码,您必须更改以下所有实例:
wp_create_nonce( "a" )
Run Code Online (Sandbox Code Playgroud)
至
wp_create_nonce( 'wp_rest' )
Run Code Online (Sandbox Code Playgroud)
此外,正如文档所述:
提供随机数作为标头是最可靠的方法。
因此,将其添加到您的ajax很简单,看起来像:
var _nonce = "<?php echo wp_create_nonce( 'wp_rest' ); ?>";
$.ajax({
type: 'POST',
url: url_path + '/foo/v1/newbee',
data: {
bid : next
},
dataType: 'json',
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'X-WP-Nonce', _nonce );
}
});
Run Code Online (Sandbox Code Playgroud)
另外,要修复支票
check_ajax_referer( 'a', $nonce, false )
Run Code Online (Sandbox Code Playgroud)
现在应该是
check_ajax_referer( 'wp_rest', '_nonce', false )
Run Code Online (Sandbox Code Playgroud)