check_ajax_referer

Проверяет Ajax запрос, не пускает внешние запросы (не со страниц сайта).

  • Функция check_ajax_referer() может быть переопределена плагинами.

  • Если $query_arg не указан (по дефолту false), то функция подразумевает что nonce код находится в переменных $_REQUEST['_ajax_nonce'] или $_REQUEST[‘_wpnonce’].

  • Если $die установлено в true, выполнение скрипта будет прервано, при неудачной проверке nonce и функция выведет на экран '-1'.
Хуки из функции:
check_ajax_referer
Возвращает

True/false. true или false, если аргумент $die установлен в false.

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

<?php check_ajax_referer( $action, $query_arg, $die ) ?>
$action(строка)
Ключ, который был указан при создании nonce кода. Указывается при создании nonce, например: wp_create_nonce(“my_nonce”).
По умолчанию: -1
$query_arg(строка)
Название ключа массива $_REQUEST, где находится значение nonce строки. Обратите внимание, что сюда нужно указать название ключа, а не само значение none.
По умолчанию: ‘_ajax_nonce’ или ‘_wpnonce’
$die(логический)

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

  • true – прервет обработку с ошибкой -1;
  • false – не прервет обработку и функция вернет true/false, в зависимости от результата проверки.

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

Примеры

#1. В основном файле устанавливаем 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>

Затем, проверяем 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 и при обработке её проверили.

Код из


wp-includes/pluggable.php

WP 4.7.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;
}