Cross-Site Request Forgery (CSRF) — одна из распространённых уязвимостей веб-приложений, в том числе и WordPress. CSRF-атака заставляет авторизованного пользователя выполнить нежелательное действие на сайте без его ведома, что может привести к изменению настроек, публикации контента или даже удалению данных. В этой статье мы подробно разберём, как защитить ваш WordPress-сайт от CSRF, используя как готовые плагины, так и собственные решения на PHP.
Что такое CSRF и почему это опасно для WordPress
CSRF работает за счёт подделки запросов от имени пользователя, который уже авторизован на сайте. Злоумышленник может, например, отправить форму с изменением пароля или настроек, если пользователь случайно откроет вредоносный сайт или кликнет по ссылке.
В WordPress многие действия требуют авторизации, и если они не защищены nonce-токенами, злоумышленники могут использовать CSRF для нанесения ущерба.
Без надёжной защиты CSRF можно использовать для:
- Изменения настроек сайта;
- Публикации нежелательного контента;
- Удаления или изменения страниц и записей;
- Изменения пароля или прав пользователей;
- Запуска вредоносных процессов, если есть уязвимости в плагинах.
Как WordPress защищает от CSRF: использование nonce
WordPress предлагает встроенный механизм защиты — nonce (число, используемое один раз), который добавляется в формы и URL, чтобы гарантировать, что запрос исходит именно от доверенного пользователя.
Для проверки nonce используются функции wp_nonce_field() и check_admin_referer() или wp_verify_nonce(). Это ключевой инструмент при разработке безопасных плагинов и тем.
Пример добавления nonce в форму
<form method="post" action="">
<?php wp_nonce_field( 'wpprotect_save_settings', 'wpprotect_nonce' ); ?>
<input type="text" name="setting" value="" />
<input type="submit" value="Сохранить" />
</form>Функция wp_nonce_field() создаст скрытое поле с nonce, которое необходимо проверить при обработке формы.
Пример проверки nonce в обработчике
function wpprotect_handle_form() {
if ( ! isset( $_POST['wpprotect_nonce'] ) || ! wp_verify_nonce( $_POST['wpprotect_nonce'], 'wpprotect_save_settings' ) ) {
wp_die( 'Ошибка безопасности: неверный nonce.' );
}
// Обработка данных формы
$setting = sanitize_text_field( $_POST['setting'] );
update_option( 'wpprotect_setting', $setting );
}
add_action( 'admin_post_wpprotect_save_settings', 'wpprotect_handle_form' );Практические советы по защите WordPress от CSRF
1. Всегда используйте nonce при создании форм, ссылок и AJAX-запросов, которые изменяют данные или настройки.
2. Проверяйте nonce на серверной стороне при обработке POST и GET запросов.
3. Используйте функции WordPress для генерации и проверки nonce вместо собственных решений.
4. Ограничьте права пользователей — например, не давайте редакторам права на удаление пользователей или изменение критических настроек.
5. Регулярно обновляйте WordPress, темы и плагины для устранения известных уязвимостей.
Плагины для дополнительной защиты от CSRF и других атак
Хотя nonce — мощный инструмент, дополнительные плагины помогают усилить защиту:
- Clearfy Pro — оптимизирует безопасность, включая защиту от CSRF и другие уязвимости;
- WPRemark — расширенный контроль безопасности комментариев и форм;
- Ninja Firewall — мощный веб-фаервол с фильтрацией CSRF-запросов.
Пример реализации CSRF-защиты для AJAX-запросов в WordPress
AJAX-запросы в WordPress также уязвимы к CSRF, если не проверять nonce. Рассмотрим пример, как добавить защиту в AJAX:
Шаг 1: Добавляем nonce в JavaScript
function wpprotect_enqueue_scripts() {
wp_enqueue_script( 'wpprotect-ajax', plugin_dir_url( __FILE__ ) . 'js/wpprotect-ajax.js', array( 'jquery' ), null, true );
wp_localize_script( 'wpprotect-ajax', 'wpprotect_ajax_obj', array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'wpprotect_ajax_nonce' )
) );
}
add_action( 'admin_enqueue_scripts', 'wpprotect_enqueue_scripts' );Шаг 2: JavaScript с nonce
jQuery(document).ready(function($) {
$('#my-button').on('click', function() {
$.post(wpprotect_ajax_obj.ajax_url, {
action: 'wpprotect_do_something',
security: wpprotect_ajax_obj.nonce,
data: 'test'
}, function(response) {
alert('Ответ сервера: ' + response);
});
});
});Шаг 3: Обработка AJAX на PHP с проверкой nonce
function wpprotect_handle_ajax() {
check_ajax_referer( 'wpprotect_ajax_nonce', 'security' );
// Обработка запроса
wp_send_json_success( 'Данные приняты успешно' );
}
add_action( 'wp_ajax_wpprotect_do_something', 'wpprotect_handle_ajax' );Заключение
CSRF — серьёзная угроза безопасности WordPress-сайтов, но благодаря встроенным механизмам nonce и дополнительным плагинам вы можете эффективно защитить свой ресурс. Обязательно внедряйте nonce в формы и AJAX-запросы, проверяйте их на сервере, ограничивайте права пользователей и следите за обновлениями. Использование плагинов, таких как Clearfy Pro, поможет автоматизировать многие задачи по безопасности и сэкономит время на разработку собственных решений.