WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Купить персональные IPV4 и IPV6 прокси

check_ajax_referer() WP 2.0.4

Проверяет Ajax запрос на соответствие nonce коду. Обрывает работу скрипта через die, если проверка не пройдена.

По умолчанию, ищет nonce код в $_REQUEST['_ajax_nonce'] и $_REQUEST['_wpnonce'].

Это pluggable функция — т.е. её можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.

Замена функции (переопределение) — в плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

Работает на основе: wp_verify_nonce()
Хуки из функции
Возвращает

false/Int. False если nonce код невалидный, 1 если nonce код валидный и был создан 0-12 часов назад, 2 если 12-24 часа назад.

Использование

check_ajax_referer( $action, $query_arg, $die );
$action(строка)
Ключ, который был указан при создании nonce кода. Указывается при создании nonce, например: wp_create_nonce("my_action").
По умолчанию: -1
$query_arg(строка)
Название ключа массива $_REQUEST, где находится значение nonce строки. Обратите внимание, что сюда нужно указать название ключа, а не само значение nonce. Если ничего не указать, то будут проверены значения $_REQUEST['_ajax_nonce'] и $_REQUEST['_wpnonce'] в поисках nonce кода.
По умолчанию: false
$die(логический)

Обрывать ли обработку скрипта в случает неудачной проверки nonce кода:

  • true - при неудачной проверке nonce, выполнение скрипта будет прервано и функция выведет на экран '-1'. Если это ajax запрос, то также будет установлен код ответа 403 (доступ запрещен).
  • false - не прервет обработку и функция вернет false/Int, в зависимости от результата проверки.

По умолчанию: true

Примеры

#1. Создание и проверка nonce кода в AJAX запросе

В основном файле устанавливаем nonce так:

<?php
// установим Nonce
$ajax_nonce = wp_create_nonce("my-special-string");
?>

<script type="text/javascript">
jQuery(document).ready(function($){
	var data = {
		action: 'my_action',
		security: '<?php echo $ajax_nonce; ?>',
		my_string: 'Hello World!'
	};
	$.post(ajaxurl, data, function(response) {
		alert("Response: " + response);
	});
});
</script>

Лучше использовать wp_localize_script() для передачи nonce кода в JS, а для JS использовать отдельный файл, который загружается через wp_enqueue_script().

Затем, проверяем nonce строку при обработке Ajax запроса:

add_action( 'wp_ajax_my_action', 'my_action_function' );
function my_action_function() {
	check_ajax_referer( 'my-special-string', 'security' );
	echo $_POST['my_string'];
	die;
}

Мы создали nonce строку с идентификатором my-special-string и при обработке её проверили.

Чтобы не задавать второй аргумент 'security' у функции check_ajax_referer достаточно назвать nonce: _wpnonce или _ajax_nonce.

Список изменений

С версии 2.0.3 Введена.

Код check ajax referer: wp-includes/pluggable.php WP 5.2.2

<?php
function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
	if ( -1 == $action ) {
		_doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '4.7' );
	}

	$nonce = '';

	if ( $query_arg && isset( $_REQUEST[ $query_arg ] ) ) {
		$nonce = $_REQUEST[ $query_arg ];
	} elseif ( isset( $_REQUEST['_ajax_nonce'] ) ) {
		$nonce = $_REQUEST['_ajax_nonce'];
	} elseif ( isset( $_REQUEST['_wpnonce'] ) ) {
		$nonce = $_REQUEST['_wpnonce'];
	}

	$result = wp_verify_nonce( $nonce, $action );

	/**
	 * Fires once the Ajax request has been validated or not.
	 *
	 * @since 2.1.0
	 *
	 * @param string    $action The Ajax nonce action.
	 * @param false|int $result False if the nonce is invalid, 1 if the nonce is valid and generated between
	 *                          0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.
	 */
	do_action( 'check_ajax_referer', $action, $result );

	if ( $die && false === $result ) {
		if ( wp_doing_ajax() ) {
			wp_die( -1, 403 );
		} else {
			die( '-1' );
		}
	}

	return $result;
}

Cвязанные функции

Из метки: Ajax

Еще из метки: nonce (защита)

Еще из раздела: Защита

9 комментов
  • Александр

    У вас ошибка на третьей строке:

    add_action( 'wp_ajax_my_action', 'my_action_function' );
    function my_action_function() {
    	check_ajax_referer( 'my-special-string', 'security' );
    	echo $_POST['my_string'];
    	die;
    }

    надо обращаться от глобальной переменной $_POST.
    Правильно так:

    check_ajax_referer( 'my-special-string', $_POST['security'] );
    -1
    Ответить3 года назад #
    • Kama7540

      Там нет никакой ошибки... Мне интересно на основании чего вы решили что там ошибка? В коде функции видно, что ошибки нет...

      Так или иначе, спасибо за комментарий, я дополнил описание второго параметра - усилил этот момент. Все-таки повсеместно принято передавать именно значение nonce, а не ключ массива где лежит это значение.

      Ответить3 года назад #
      • WPShop5 wpshop.ru

        Чтобы не задавать второй аргумент 'security' у ф-ции check_ajax_referer достаточно назвать nonce _wpnonce или _ajax_nonce. А так пример правильный, только что проверил. Там именно 'security' должен быть.

        2
        Ответить2.1 года назад #
  • @ mi133 trapeznaya.ucoz.ru

    Подскажите, а как меняется nonce wordpresom, перезапустил браузер, а nonce один и тот же? Или так задумано? И второй вопрос: будет ли nonce работать так -

    $nonce = wp_create_nonce('my-nonce');//в functions.php
    
    global $nonce;//в single.php
    <button data="$nonce".....>
    
    global $nonce;//в functions.php проверка
    if ($nonce!=$_GET['data']) {wp_die('stop');}
    Ответить8 мес назад #
    • @ campusboy3412 www.youtube.com/c/wpplus

      Подскажите, а как меняется nonce wordpresom, перезапустил браузер, а nonce один и тот же?

      О nonce коде и как он формируется можете прочесть в нашей статье "Одноразовые числа" и в описании функции wp_create_nonce().

      1
      Ответить8 мес назад #
  • Добрый день, возможно ли использовать подобную проверку вместе с кешированием страниц сайта? На моем сайте для не авторизированных пользователей через сутки вылетают 403 ошибки при аякс запросах, я так понимаю связано это с тем что генерируется кэшированная html версия сайта в которой "старый" nonce. Можно ли использовать, аякс запросы без проверки nonce поля, на сколько это опасно/безопасно ?

    Ответить3 мес назад #
    • Kama7540

      Можно. Все зависит от запроса и того что он делает. Например для запросов которые получают какую-то инфу проверка вообще по сути никакая не нужна, а вот запросы которые что-то обновляют в БД нуждаются в проверке, на право и желательно на правильный нонскод, но если код не публичный, то вряд ли отсутствие нонскода сильно повлияет на безопасность, как-то так...

      1
      Ответить3 мес назад #
      • В моем случае часть аякс запросов используются для получения данных с бд, а часть вообще не связана с бд. Но ни один запрос не вносит изменения в бд. Для всех запросов в бд использую функции обертки типа get_posts(), get_terms() иногда через класс WP_Query(); Я могу предположить, что для всех этих инструментов существует экранирование данных и подготовка переменных для использования их в SQL запросах. Поэтому бояться SQL инъекций наверное не стоит.
        Так же планирую прогонять все запросы через функции типа strip_tags(), на тот случай если хацкер захочет отправить какой-то скрипт.

        Ответить3 мес назад #
        • Kama7540

          бояться SQL инъекций наверное не стоит

          Да WP функции чистят это все

          Про очистку данных, ознакомьтесь с этой статьей, если еще этого не сделали.

          1
          Ответить3 мес назад #
Здравствуйте, !     Войти . Зарегистрироваться