Как использовать nonces в WordPress для защиты форм и AJAX-запросов

Что такое nonce и зачем он нужен в WordPress

Nonce (Number used ONCE) — уникальный токен, который WordPress использует для защиты от CSRF-атак (Cross-Site Request Forgery). Это временный код, который подтверждает, что запрос к серверу сделан легитимным пользователем, а не злоумышленником с другого сайта.

Использование nonce особенно важно при работе с формами, отправляющими данные на сервер, и AJAX-запросами, меняющими состояние сайта. Без nonce злоумышленник может подделать запросы и нарушить работу сайта или получить несанкционированный доступ.

Диагностика проблемы: почему мои формы и AJAX-запросы могут быть уязвимы

Если вы не добавляете nonce в формы и AJAX-запросы, возможны следующие проблемы:

  • Формы могут быть отправлены с фальшивых страниц, что приведёт к нежелательным действиям (изменение данных, удаление, создание записей).
  • Злоумышленники могут писать скрипты, которые отправляют запросы от имени администратора без его ведома.
  • Отсутствие nonce усложняет аудит безопасности и выявление уязвимостей.

Пошаговое решение: как добавить и проверить nonce в формах и AJAX-запросах

1. Добавление nonce в HTML-форму

Используйте функцию wp_nonce_field() для генерации скрытого поля с nonce. Например:

<form method="post" action="">
    <?php wp_nonce_field('my_form_action', 'my_form_nonce'); ?>
    <input type="text" name="user_input" />
    <input type="submit" value="Отправить" />
</form>

Здесь 'my_form_action' — название действия, а 'my_form_nonce' — имя поля в форме.

2. Проверка nonce в обработчике формы

При обработке данных проверяйте nonce с помощью check_admin_referer() или wp_verify_nonce(). Пример:

if ( isset($_POST['my_form_nonce']) && check_admin_referer('my_form_action', 'my_form_nonce') ) {
    // Безопасно обрабатываем данные
    $input = sanitize_text_field($_POST['user_input']);
    // Дальнейшая логика
} else {
    wp_die('Ошибка безопасности: неверный nonce');
}

3. Использование nonce в AJAX-запросах

Для AJAX важно передавать nonce и проверять его в обработчике PHP.

Добавление nonce в JavaScript

wp_localize_script('my-script-handle', 'MyAjax', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
    'nonce' => wp_create_nonce('my_ajax_action')
));

В JS-запросе:

jQuery.post(MyAjax.ajaxurl, {
    action: 'my_ajax_action',
    nonce: MyAjax.nonce,
    data: someData
}, function(response) {
    console.log(response);
});

Проверка nonce в PHP-обработчике

add_action('wp_ajax_my_ajax_action', 'my_ajax_handler');
function my_ajax_handler() {
    check_ajax_referer('my_ajax_action', 'nonce');
    // Обработка данных
    wp_send_json_success('Данные обработаны');
}

Проверка результата после внедрения nonce

  • Отправляйте формы и проверяйте, что при удалении или изменении поля nonce сервер отвечает ошибкой безопасности.
  • В AJAX-запросах при неправильном или отсутствующем nonce сервер должен возвращать ошибку 403 или сообщение об ошибке.
  • Используйте инструменты разработчика браузера для отладки отправляемых данных и убедитесь, что nonce передаётся корректно.

Частые ошибки при работе с nonce и как их исправить

  • Неправильное имя nonce-поля: Функция check_admin_referer() требует точного совпадения имени поля, иначе проверка всегда будет проваливаться. Проверьте, что имена совпадают.
  • Использование nonce вне контекста сессии: Nonce привязан к сессии пользователя, поэтому если отправлять формы с других устройств или браузеров, nonce может быть недействителен.
  • Отсутствие вызова wp_enqueue_script и локализации скрипта: В AJAX nonce нужно передавать в JS через wp_localize_script(), иначе скрипт не будет знать значение nonce.
  • Игнорирование проверки nonce в обработчиках: Некоторые разработчики забывают проверять nonce в обработчиках, что сводит защиту на нет.

Практические советы по безопасности и производительности

  • Используйте уникальные имена для nonce-действий, чтобы исключить коллизии с другими плагинами или темами.
  • Не увеличивайте время жизни nonce, стандартное значение (~24 часа) достаточно для большинства задач.
  • Минимизируйте доступность nonce к клиенту — не выводите nonce там, где это не нужно.
  • Для AJAX-запросов всегда используйте check_ajax_referer(), а не check_admin_referer(), так как они работают в разных контекстах.
  • При работе с REST API в WordPress используйте встроенные методы проверки nonce и авторизации.

Сравнение вариантов защиты форм: nonce vs. другие методы

МетодПреимуществаНедостатки
NonceВстроен в WordPress, прост для реализации, защищает от CSRFПривязан к сессии, нельзя использовать для долгосрочных ссылок
CAPTCHAЗащищает от ботов, повышает уровень безопасностиМожет ухудшить UX, не защищает от CSRF
HTTP-авторизацияСильная защита, подходит для APIТребует дополнительных настроек, не всегда применима для форм
Как защитить WordPress от ботов и скриптовых атак
13.02.2026
Как защитить WordPress от CSRF-атак: практические методы и примеры кода
19.03.2026
Как защитить WordPress от привязки к одному IP
25.12.2025
Как сделать безопасный импорт и экспорт данных WooCommerce: практические решения
20.05.2026
Обновление корзины WooCommerce без перезагрузки страницы: практические методы и примеры
02.06.2026