В WordPress nonce (number used once) — это специальный токен безопасности, который помогает защитить формы и запросы от CSRF-атак (Cross-Site Request Forgery). В этой статье подробно разберём, как правильно создавать, проверять и использовать nonce в своих плагинах и темах, чтобы повысить безопасность вашего сайта.
Что такое nonce в WordPress и зачем он нужен
Nonce — это временный уникальный ключ, который генерируется для конкретного действия и пользователя. Он служит доказательством того, что запрос действительно исходит с вашего сайта и от авторизованного пользователя, а не злоумышленника.
WordPress использует nonce для:
- Защиты форм (например, отправки комментариев, настроек)
- Защиты AJAX-запросов
- Защиты URL с действиями, такими как удаление или обновление записи
Nonce не является криптографической защитой, а скорее маркером с ограниченным сроком, который нужно проверять на сервере.
Как создать и добавить nonce в форму
Для генерации nonce в WordPress используется функция wp_create_nonce. Но обычно для форм удобнее применять wp_nonce_field, которая создаёт скрытое поле с nonce и полем действия.
Пример добавления nonce в форму:
<form method="post" action="">
<?php wp_nonce_field('wpexamples_save_data_action', 'wpexamples_nonce_field'); ?>
<input type="text" name="user_input" />
<input type="submit" value="Сохранить" />
</form>
Здесь первый параметр — это действие (action), которое вы будете проверять при обработке формы, а второй — имя поля nonce (обычно уникальное, чтобы избежать конфликтов).
Как проверить nonce при обработке формы
При приёме данных из формы нужно обязательно проверить nonce, чтобы убедиться, что форма отправлена легитимно. Для этого используется функция check_admin_referer или check_ajax_referer для AJAX-запросов.
Пример проверки nonce в обработчике формы:
function wpexamples_handle_form() {
if (!isset($_POST['wpexamples_nonce_field']) ||
!wp_verify_nonce($_POST['wpexamples_nonce_field'], 'wpexamples_save_data_action')) {
wp_die('Ошибка проверки безопасности. Пожалуйста, обновите страницу и попробуйте снова.');
}
// Обработка данных после успешной проверки
$user_input = sanitize_text_field($_POST['user_input']);
// Сохранение или иные действия
}
add_action('admin_post_wpexamples_save', 'wpexamples_handle_form');
Здесь мы вручную вызываем wp_verify_nonce, которая возвращает true, если nonce валиден.
Использование nonce в AJAX-запросах WordPress
При работе с AJAX важно передавать nonce в запросах и проверять его на сервере, чтобы никто не мог выполнять произвольные действия.
Генерация nonce для AJAX
Обычно nonce генерируется в PHP и передаётся в JavaScript через wp_localize_script:
function wpexamples_enqueue_scripts() {
wp_enqueue_script('wpexamples-script', plugin_dir_url(__FILE__) . 'js/wpexamples.js', array('jquery'), null, true);
wp_localize_script('wpexamples-script', 'wpexamplesData', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpexamples_ajax_nonce')
));
}
add_action('wp_enqueue_scripts', 'wpexamples_enqueue_scripts');
Пример AJAX-запроса с nonce на клиенте
jQuery(document).ready(function($) {
$('#submit-button').on('click', function(e) {
e.preventDefault();
$.post(wpexamplesData.ajax_url, {
action: 'wpexamples_ajax_action',
nonce: wpexamplesData.nonce,
data: $('#input-field').val()
}, function(response) {
alert('Ответ сервера: ' + response.data);
});
});
});
Обработка AJAX-запроса с проверкой nonce на сервере
function wpexamples_ajax_handler() {
check_ajax_referer('wpexamples_ajax_nonce', 'nonce');
$data = isset($_POST['data']) ? sanitize_text_field($_POST['data']) : '';
// Логика обработки данных
wp_send_json_success('Данные получены: ' . $data);
}
add_action('wp_ajax_wpexamples_ajax_action', 'wpexamples_ajax_handler');
add_action('wp_ajax_nopriv_wpexamples_ajax_action', 'wpexamples_ajax_handler');
Особенности использования nonce и лучшие практики
Несколько важных советов при работе с nonce в WordPress:
- Nonce имеют срок жизни 12-24 часа — это значит, что их нельзя использовать для долгосрочной защиты, только для временной проверки.
- Всегда используйте уникальные имена и действия для nonce, чтобы избежать конфликтов с другими плагинами и темами.
- Для форм в админке можно использовать
check_admin_referer, для фронтенда —wp_verify_nonceили свои проверки. - Если nonce не прошёл проверку, не просто игнорируйте это — лучше вывести ошибку или прекратить выполнение скрипта.
- Для AJAX-запросов используйте
check_ajax_referer, она автоматически завершит запрос с ошибкой при неверном nonce.
Пример полноценного плагина с использованием nonce для формы и AJAX
Ниже пример минимального плагина, который демонстрирует создание формы с nonce и обработку AJAX:
<?php
/**
* Plugin Name: WPExamples Nonce Demo
*/
// Добавляем форму на страницу
function wpexamples_add_form() {
if (!is_user_logged_in()) return;
?>
<form id="wpexamples-form" method="post" action="">
<?php wp_nonce_field('wpexamples_save_action', 'wpexamples_nonce'); ?>
<input type="text" name="user_input" id="user_input" />
<input type="submit" value="Сохранить" />
</form>
<button id="ajax-button">Отправить AJAX</button>
<script>
jQuery(document).ready(function($) {
$('#ajax-button').on('click', function(e) {
e.preventDefault();
$.post(ajaxurl, {
action: 'wpexamples_ajax_save',
nonce: '<?php echo wp_create_nonce('wpexamples_ajax_nonce'); ?>',
data: $('#user_input').val()
}, function(response) {
alert(response.data);
});
});
});
</script>
<?php
}
add_action('wp_footer', 'wpexamples_add_form');
// Обработка POST формы
function wpexamples_handle_post() {
if (!isset($_POST['wpexamples_nonce']) || !wp_verify_nonce($_POST['wpexamples_nonce'], 'wpexamples_save_action')) {
wp_die('Ошибка безопасности при отправке формы.');
}
$input = sanitize_text_field($_POST['user_input']);
// Здесь можно сохранить данные или обработать
}
add_action('admin_post_nopriv_wpexamples_save', 'wpexamples_handle_post');
add_action('admin_post_wpexamples_save', 'wpexamples_handle_post');
// Обработка AJAX
function wpexamples_ajax_save() {
check_ajax_referer('wpexamples_ajax_nonce', 'nonce');
$data = isset($_POST['data']) ? sanitize_text_field($_POST['data']) : '';
wp_send_json_success('AJAX данные получены: ' . $data);
}
add_action('wp_ajax_wpexamples_ajax_save', 'wpexamples_ajax_save');
add_action('wp_ajax_nopriv_wpexamples_ajax_save', 'wpexamples_ajax_save');
Заключение по использованию nonce в WordPress
Использование nonce — обязательный элемент безопасности при работе с формами и AJAX-запросами в WordPress. Правильно применённый nonce существенно снижает риск CSRF-атак и защищает ваш сайт от нежелательных действий. Важно всегда создавать, передавать и проверять nonce для каждого критического действия, а также корректно обрабатывать ошибки проверки.
Для более сложных проектов можно использовать плагины безопасности, такие как Clearfy Pro, которые автоматизируют многие аспекты защиты и оптимизации WordPress.