Smart Wordpress people say插件开发者应该在每个AJAX请求中使用一个nonce,该请求从页面发送回wordpress博客(admin-ajax.php)。
这是通过(1)在服务器端通过
生成随机数来完成的$nonce = wp_create_nonce ('my-nonce');
...(2)使该nonce可用于发送AJAX请求的Javascript代码。例如,您可以这样做:
function myplg_emit_scriptblock() {
$nonce = wp_create_nonce('myplg-nonce');
echo "<script type='text/javascript'>\n" .
" var WpPlgSettings = {\n" .
" ajaxurl : '" . admin_url( 'admin-ajax.php' ) . "',\n" .
" nonce : '" . $nonce . "'\n" .
" };\n" .
"</script>\n";
}
add_action('wp_print_scripts','myplg_emit_scriptblock');
...然后(3)javascript ajax逻辑引用该全局变量。
var url = WpPlgSettings.ajaxurl +
"?action=my-wp-plg-action&" +
"nonce=" + WpPlgSettings .nonce +
"docid=" + id;
$.ajax({type: "GET",
url: url,
headers : { "Accept" : 'application/json' },
dataType: "json",
cache: false,
error: function (xhr, textStatus, errorThrown) {
...
},
success: function (data, textStatus, xhr) {
...
}
});
...最后(4)检查服务器端逻辑中收到的nonce。
add_action( 'wp_ajax_nopriv_skydrv-hotlink', 'myplg_handle_ajax_request' );
add_action( 'wp_ajax_skydrv-hotlink', 'myplg_handle_ajax_request' );
function myplg_handle_ajax_request() {
check_ajax_referer( 'myplg-nonce', 'nonce' ); // <<=-----
if (isset($_GET['docid'])) {
$docid = $_GET['docid'];
$response = myplg_generate_the_response($docid);
header( "Content-Type: application/json" );
echo json_encode( $response ) ;
}
else {
$response = array("error" => "you must specify a docid parameter.");
echo json_encode( $response ) ;
}
exit;
}
但检查如何真正起作用?
答案 0 :(得分:14)
Revising some AJAX procedures,我遇到了同样的问题。检查function code:
是一件简单的事情function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
if ( $query_arg )
$nonce = $_REQUEST[$query_arg];
else
$nonce = isset($_REQUEST['_ajax_nonce']) ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce'];
$result = wp_verify_nonce( $nonce, $action );
if ( $die && false == $result ) {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
wp_die( -1 );
else
die( '-1' );
}
do_action('check_ajax_referer', $action, $result);
return $result;
}
如果wp_verify_nonce
为false
且您尚未在false
参数中发送$die
,则会执行wp_die( -1 );
。
在您的示例代码中,check_ajax_referer()
将中断执行并将-1
返回到AJAX调用。如果您想自己处理错误,请添加参数$die
并使用$do_check
执行您的操作:
$do_check = check_ajax_referer( 'myplg-nonce', 'nonce', false );
请注意,在WordPress中处理AJAX的正确方法是:register,enqueue和localize使用wp_enqueue_scripts
代替wp_print_scripts
的JavaScript文件。<登记/>
见Use wp_enqueue_scripts() not wp_print_styles()。
答案 1 :(得分:0)
只是测试“nonce”代码与给定的代码匹配,因此黑客无法切入并获得数据库的快捷方式。如果安全代码不匹配,php将死亡,页面将停止。
“如果您的代码已经过正确验证,它将继续过去,否则会触发死亡(' - 1');停止代码死机。”