Вопрос по ajax, nonce, wordpress – Как действительно работает check_ajax_referer ()?

2

Умные люди Wordpress говорят разработчики этого плагина должны использовать одноразовый номер в каждом запросе AJAX, который отправляется со страницы обратно в блог WordPress (admin-ajax.php).

Это делается путем (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) логика ajax 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) проверка полученного одноразового номера в серверной логике.

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

Но как на самом деле работает проверка?

Ваш Ответ

2   ответа
13

Пересмотр некоторых процедур AJAXЯ пришел к тому же вопросу. И это простой вопрос проверкикод функции:

 $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:регистр, Ставить а такжелокализовать файлы JavaScript, использующиеwp_enqueue_scripts вместоwp_print_scripts.
See Используйте wp_enqueue_scripts (), а не wp_print_styles ().

Вы собираетесь получить значок, потому что я приму ваш ответ через 14 месяцев после публикации вопроса. Спасибо! Cheeso
Я думаю, что значок появляется, когда есть 2 ответа;) Приятно видеть, что старый Q решается, добро пожаловать!
0

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

& quot; Если ваш код проверен правильно, он продолжится, а если нет, то вызовет die ('-1' '); остановить ваш код мертвым. & quot;

Похожие вопросы