2012-06-03 7 views
2

Smart Wordpress people say, что разработчики плагинов должны использовать nonce в каждом запросе AJAX, который отправляется со страницы обратно в блог wordpress (admin-ajax.php).Как работает check_ajax_referer()?

Это делается (1), генерирующего случайное слово на стороне сервера, через

$nonce = wp_create_nonce ('my-nonce'); 

... (2) решений, что временное значение доступной Javascript кода, который посылает AJAX запросы. Например, вы могли бы сделать это следующим образом:

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 логические ссылки Аякса, что глобальная переменная.

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; 
} 

Но как работает проверка?

ответ

12

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); 

Обратите внимание, что правильный способ справиться с AJAX в WordPress является: register, enqueue и localize файлы JavaScript используя wp_enqueue_scripts вместо wp_print_scripts.
См. Use wp_enqueue_scripts() not wp_print_styles().

+0

Вы собираетесь получить пропуск, потому что я приму свой ответ, через 14 месяцев после того, как я разместил вопрос. Благодаря! – Cheeso

+0

Я думаю, что значок появляется, когда есть 2 upvotes;) Приятно видеть, что старый Q будет разрешен, пожалуйста! – brasofilo

0

Это всего лишь тест на то, что код «nonce» соответствует тому, что было дано, поэтому хакер не может разрезать и получить ярлык для вашей базы данных. Если код безопасности не соответствует, php умрет и страница остановится.

«Если код правильно проверен, он будет продолжен, если он не запустит die ('- 1'), остановив ваш код мертвым».