Проверка токена nonce в WordPress: WP_VERIFY_NONCE()
Функция wp_verify_nonce()
используется в WordPress для проверки токена nonce. Этот токен является важным элементом обеспечения безопасности и используется для подтверждения того, что запрос был сделан на вашем сайте и не является вредоносным.
Что такое nonce и как он создаётся?
Токен nonce создаётся с помощью одной из следующих функций:
wp_nonce_field()
wp_create_nonce()
wp_referer_field()
wp_nonce_url()
Примечание
Функция wp_verify_nonce()
является заменяемой (pluggable), что означает, что её можно изменить с помощью плагинов. Эта функция загружается только после включения всех плагинов, поэтому её нельзя вызывать напрямую из кода плагина. Вызывайте её на хуке plugins_loaded
или позже, например, на хуке init
.
Как изменить функцию?
Чтобы изменить функцию, создайте функцию с тем же именем в вашем плагине или "must-use" плагине. Это заменит стандартную реализацию.
Как работает wp_verify_nonce
Функция возвращает одно из следующих значений:
1
: если nonce действителен и был сгенерирован от 0 до 12 часов назад.2
: если nonce действителен и был сгенерирован от 12 до 24 часов назад.false
: если nonce недействителен.
Использование функции
Вот как использовать wp_verify_nonce()
:
wp_verify_nonce( $nonce, $action );
Параметры
- $nonce (string) (обязательный): токен nonce, который использовался в форме для проверки. Обычно передаётся в запросе:
$_POST['_wpnonce']
. - $action (string|int) (необязательный): ключ, который использовался для создания токена. По умолчанию:
-1
. Если значение не было указано при создании ключа, просто пропустите его.
Пример использования
Проверка nonce для запроса $_GET
$nonce = wp_create_nonce('my-nonce');
?>
Перейти к данным
Как работает пример
- Мы создаём токен nonce с помощью
wp_create_nonce()
. - Токен передаётся через URL.
- При получении запроса проверяем токен с помощью
wp_verify_nonce()
. Если он действителен, обрабатываем да��ные. Если нет, выводим сообщение о запрете доступа.
Код функции wp_verify_nonce
Вот как выглядит код функции в WordPress:
function wp_verify_nonce( $nonce, $action = -1 ) {
$nonce = (string) $nonce;
$user = wp_get_current_user();
$uid = (int) $user->ID;
if ( ! $uid ) {
$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
}
if ( empty( $nonce ) ) {
return false;
}
$token = wp_get_session_token();
$i = wp_nonce_tick( $action );
// Nonce сгенерирован 0-12 часов назад
$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
if ( hash_equals( $expected, $nonce ) ) {
return 1;
}
// Nonce сгенерирован 12-24 часов назад
$expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
if ( hash_equals( $expected, $nonce ) ) {
return 2;
}
do_action( 'wp_verify_nonce_failed', $nonce, $action, $user, $token );
// Неверный nonce
return false;
}
Заключение
Функция wp_verify_nonce()
— это важный инструмент для обеспечения безопасности вашего сайта на WordPress. Она помогает предотвратить атаки на ваш сайт, удостоверяясь в том, что запросы исходят именно от ваших пользователей. Используйте её правильно, чтобы защитить свой ресурс!