Smart Wordpress people say插件開發人員應該在從頁面發送回wordpress博客(admin-ajax.php)的每個AJAX請求中使用隨機數。check_ajax_referer()如何工作?
這是通過(1)生成在服務器端隨機數經由
$nonce = wp_create_nonce ('my-nonce');
...(2),使得提供給發送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;
}
但是檢查真的有效嗎?
您即將獲得徽章,因爲我會在發佈問題14個月後接受您的回答。謝謝! – Cheeso
我認爲徽章是在有兩個upvotes時出現的;)很高興看到一個老Q正在解決,歡迎您! – brasofilo