check_ajax_referer()
Проверяет Ajax запрос на соответствие nonce коду. Обрывает работу скрипта через die, если проверка не пройдена.
По умолчанию, ищет nonce код в $_REQUEST['_ajax_nonce']
и $_REQUEST['_wpnonce']
.
Это pluggable функция — т.е. её можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена… Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.
Замена функции (переопределение) — в плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.
wp_verify_nonce()
Хуки из функции
check_ajax_referer
Возвращает
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
- true — при неудачной проверке nonce, выполнение скрипта будет прервано и функция выведет на экран
Примеры
#1. Создание и проверка nonce кода в AJAX запросе
В основном файле устанавливаем nonce так:
// установим Nonce
$ajax_nonce = wp_create_nonce("my-special-string");
<script type="text/javascript">
jQuery(document).ready(function($){
var data = {
action: 'my_action',
security: '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.3
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;
}
источник: https://wp-kama.ru/function/check_ajax_referer