Проверка токена nonce в WordPress: WP_VERIFY_NONCE()

Проверка токена 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');
?>

Перейти к данным

Как работает пример

  1. Мы создаём токен nonce с помощью wp_create_nonce().
  2. Токен передаётся через URL.
  3. При получении запроса проверяем токен с помощью 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. Она помогает предотвратить атаки на ваш сайт, удостоверяясь в том, что запросы исходят именно от ваших пользователей. Используйте её правильно, чтобы защитить свой ресурс!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *