AJAX nonce с использованием check_ajax_referer()

7 дек. 2015 г., 12:08:07
Просмотры: 19.7K
Голосов: 6

Я хочу использовать check_ajax_referer() для проверки поля WP_nonce с помощью AJAX. Вот мой HTML-элемент:

<input type="hidden" name="login_nonce" value="<?= wp_create_nonce('login_nonce'); ?>"/>

С помощью jQuery я отправляю все значения из полей ввода через POST-запрос:

request = $.ajax({
  type: 'POST',
  url: 'handle-login.php',
  data: {
    user: $('input[name="login_username"]').val(),
    pass: $('input[name="login_password"]').val(),
    security: $('input[name="login_nonce"]').val()
  },
  dataType: 'json'
});

В handle-login.php я пытаюсь сделать следующее:

require_once $_SERVER['DOCUMENT_ROOT'].'/wp-load.php';

$return = array();
if( check_ajax_referer( 'login_nonce', $_POST['security'], false ) )
    $return['nonce'] = $_POST['login_nonce'];

echo $return

Но в ответ я ничего не получаю... Кто-нибудь знает, в чем проблема?

0
Все ответы на вопрос 3
0

Трудно сказать наверняка, где именно ошибка, так как вы не упомянули о вашем add_action('wp_ajax_my_function','whatever_callback');, что, как я думаю, вы упустили. Но ваш вопрос не хватает информации в этом отношении.

Вот как бы я подошел к решению:

В вашем файле functions.php или аналогичном:

add_action(wp_ajax_handle_login, 'handle_login_ajax');
add_action(wp_ajax_nopriv_handle_login, 'handle_login_ajax');

Убедитесь, что ваш файл handle-login.php подключен в основном php-файле вашего плагина или темы, например в functions.php

require_once plugin_dir_path(__FILE__) . 'handle-login.php';

Вам следует объявить переменные nonce и URL для AJAX сразу после подключения вашего js-файла, чтобы иметь к ним доступ:

wp_enqueue_script('wccajs',plugin_dir_url( dirname(__FILE__) ) . 'login.js',array('jquery'),'1.0',false);

wp_localize_script('wccajs','MyAjax',array( 
    'ajax_url' => admin_url( 'admin-ajax.php' ),
    'security' => wp_create_nonce('handle_login')
) );

В вашем файле handle-login.php:

function handle_login_ajax(){
    check_ajax_referer('handle_login', 'security');
    $return = array();
    echo $return;
    wp_die(); // Вы также пропустили это
}

Ваш Javascript файл:

function send_stuff_to_server(){

var data = {
    'action': 'handle_login', // пропущено, должно совпадать с вашим хуком действия wp_ajax_{handle_login}
    'security': MyAjax.security // Мы можем получить доступ к нему таким образом
}

$.post(MyAjax.ajax_url, data, function (callBack) {
      console.log(callBack); // Вернет nonce
});

}

Надеюсь, это поможет.

5 мар. 2016 г. 22:35:58
0

У меня были такие же проблемы, и я решил их, используя другую связанную AJAX-функцию: Просто заменив ваш

check_ajax_referer( 'login_nonce', $_POST['security'], false )

на

wp_verify_nonce( $_POST['security'], 'login_nonce' )

вроде бы работает и возвращает true/false корректно. Что касается того, какой способ безопаснее, я нашел вот эту информацию:

wp_verify_nonce vs check_admin_referer

9 мар. 2017 г. 11:58:07
0

В методе check_ajax_referer() второй параметр — это не значение nonce, а ключ параметра POST-запроса.

check_ajax_referer( 'login_nonce', 'security', false );

18 июн. 2020 г. 18:52:46