Nonce WordPress
Оригинальное название: WordPress nonce
Коротко
Одноразовый по смыслу защитный токен WordPress, который подтверждает, что действие запросил сам пользователь со страницы сайта, а не чужая страница от его имени.
Что такое «Nonce WordPress»
Слово nonce означает «number used once» — число, используемое один раз. Его задача — защитить от подделки межсайтовых запросов (CSRF). Представьте: администратор вошёл в админку, а потом открыл чужой сайт, где спрятана форма, отправляющая запрос «удалить запись 15» на ваш домен. Браузер приложит cookie авторизации, и без дополнительной проверки WordPress выполнит команду. Nonce закрывает эту дыру: в настоящую форму сервер заранее вписывает токен, которого злоумышленник знать не может.
Как устроен nonce в WordPress
Название немного обманчиво. Токен WordPress не одноразовый: он вычисляется из названия действия, ID пользователя, его сессии и отрезка времени и действует до суток, причём повторно. Ключ NONCE_KEY из wp-config.php участвует в расчёте. У разных пользователей и разных действий токены разные.
Пример проверки в обработчике формы
// В форме
wp_nonce_field( 'delete_order', 'order_nonce' );
// В обработчике
if ( ! isset( $_POST['order_nonce'] )
|| ! wp_verify_nonce( $_POST['order_nonce'], 'delete_order' ) ) {
wp_die( 'Ссылка устарела, обновите страницу.' );
}
if ( ! current_user_can( 'delete_posts' ) ) {
wp_die( 'Недостаточно прав.' );
}
Для ссылок есть wp_nonce_url(), для админки — check_admin_referer(), для AJAX-запросов — check_ajax_referer(). REST API ждёт токен для действия wp_rest в заголовке X-WP-Nonce.
Чего nonce не делает
- Не проверяет права. Токен подтверждает намерение, но не то, что пользователю это действие разрешено. Без
current_user_can()и проверки возможностей защита неполная. - Не живёт вечно. Если страницу с формой закешировали надолго, через сутки токен в ней станет недействительным, и отправка начнёт падать с ошибкой. Формы в кешируемых страницах либо исключают из кеша, либо получают токен отдельным запросом.
- Не защищает от гостевых атак так же надёжно: для незалогиненных посетителей токен у всех одинаковый.
Это одна из базовых мер безопасности приложения, и её отсутствие — частая находка при проверке самописных плагинов.

