Когда вы обрабатываете AJAX-запросы в WordPress, важно убедиться, что запрос пришёл с вашего сайта, а не от злоумышленника. Именно для этого существует функция check_ajax_referer() — она проверяет одноразовый токен (nonce) и блокирует подозрительные обращения до выполнения любой логики.
Синтаксис
check_ajax_referer( $action = -1, $query_arg = false, $die = true )
Параметры функции
$action — строка или число. Это ключ действия, который вы указывали при создании nonce через wp_create_nonce(). Связывает токен с конкретной операцией.
$query_arg — строка. Название поля, в котором передаётся nonce. Если не указать, WordPress сам проверит поля _ajax_nonce и _wpnonce.
$die — boolean. Определяет поведение при неудачной проверке. При значении true (по умолчанию) скрипт останавливается через wp_die(). При false — функция возвращает false, 1 или 2, и вы можете обработать ошибку самостоятельно.
Пример: создаём nonce на стороне PHP и передаём в JS
Сначала генерируем токен и передаём его в JavaScript через встроенный скрипт:
$ajax_nonce = wp_create_nonce( 'true_security' );
echo '<script>
jQuery( function( $ ) {
var data = {
action: "true_action",
security: "' . $ajax_nonce . '",
true_str: "Привет!"
};
$.post( ajaxurl, data, function( response ) {
console.log( "Ответ с сервера: " + response );
});
});
</script>';
Пример: проверяем nonce в AJAX-обработчике
В обработчике первым делом вызываем проверку — до выполнения каких-либо действий:
add_action( 'wp_ajax_true_action', 'true_ajax_cb' );
function true_ajax_cb() {
check_ajax_referer( 'true_security', 'security' );
echo $_POST['true_str'];
die;
}
Здесь 'true_security' — ключ действия, совпадающий с тем, что указали при создании nonce. Поле 'security' — имя параметра, в котором фронтенд отправил токен.
Зачем это нужно
Без проверки nonce любой сторонний сайт может отправить запрос к вашему AJAX-обработчику от имени авторизованного пользователя — это CSRF-атака. Одна строка check_ajax_referer() в начале обработчика надёжно закрывает эту уязвимость.