Функция wp_verify_nonce()
используется для проверки одноразового кода безопасности (nonce), который имеет временной лимит действия. Этот код предотвращает CSRF-атаки, защищая данные от несанкционированного доступа.
Одноразовый код (nonce) действителен в течение 24 часов по умолчанию. Функция возвращает результат проверки этого кода с указанием времени его создания.
wp_verify_nonce( string $nonce, string|int $action = -1 ): int|false
Параметры
- $nonce (string) (обязательный): Значение nonce, которое нужно проверить. Обычно передается через запрос (например, в
$_GET
или$_POST
). - $action (string|int) (необязательный): Контекст действия, связанный с созданием nonce. Он должен быть таким же, как и при создании кода. По умолчанию:
-1
.
Возвращаемые значения
- 1: Если код был создан менее 12 часов назад.
- 2: Если код был создан от 12 до 24 часов назад.
- false: Если проверка не пройдена (код неверный или истек срок действия).
Важные моменты
- Nonce не предназначен для использования в качестве механизма аутентификации или контроля доступа. Для этого нужно использовать такие функции, как
current_user_can()
. - Nonce может быть скомпрометирован, поэтому функции, использующие его, должны быть защищены дополнительными проверками доступа.
Пример 1: Проверка nonce, созданного через wp_create_nonce()
Шаг A: Создаем nonce и добавляем его в ссылку.
// Создание nonce
$nonce = wp_create_nonce( 'my-nonce' );
// Добавляем nonce в URL
echo "<a href='myplugin.php?_wpnonce={$nonce}'>" . __( 'Save Something', 'textdomain' ) . "</a>";
Шаг B: Проверяем nonce в файле, который обрабатывает запрос.
$nonce = $_REQUEST['_wpnonce'];
// Проверка nonce
if ( ! wp_verify_nonce( $nonce, 'my-nonce' ) ) {
die( __( 'Security check', 'textdomain' ) );
} else {
// Дальнейшая обработка
}
Пример 2: Действия в зависимости от возраста nonce
$nonce = wp_verify_nonce( $nonce, 'my-nonce' );
switch ( $nonce ) {
case 1:
echo 'Nonce создан менее 12 часов назад.';
break;
case 2:
echo 'Nonce создан от 12 до 24 часов назад.';
break;
default:
exit( 'Неверный nonce.' );
}
Пример 3: Использование nonce с проверкой на его наличие
Согласно стандартам кодирования WordPress, корректная проверка наличия nonce:
if ( isset( $_REQUEST['_wpnonce'] ) && wp_verify_nonce( $_REQUEST['_wpnonce'], 'wpdocs-my-nonce' ) ) {
// Действие после успешной проверки
} else {
die( __( 'Security check', 'textdomain' ) );
}
Дополнительная информация
Одноразовый код (nonce) создается одной из следующих функций:
wp_nonce_field()
wp_create_nonce()
wp_referer_field()
wp_nonce_url()
Функция wp_verify_nonce()
является pluggable, то есть ее можно заменить в плагинах. Это важно учитывать при использовании ее в собственных плагинах.
Связанные хуки
nonce_user_logged_out
: Используется при создании nonce для пользователей, которые не вошли в систему.wp_verify_nonce_failed
: Хук, который срабатывает при неудачной проверке nonce.
Заключение
Функция wp_verify_nonce()
помогает защитить приложения WordPress от CSRF-атак, проверяя одноразовые коды безопасности (nonce). Тем не менее, она не должна использоваться в качестве основной меры безопасности и всегда должна дополняться другими механизмами, такими как проверка прав пользователя через current_user_can()
.