Работа с входящими данными — одна из важнейших задач при разработке на WordPress. Без правильной проверки и очистки данных ваш сайт становится уязвим к XSS, SQL-инъекциям и другим атакам. В этой статье мы подробно разберём, как добавлять проверку (валидацию) и очистку (санитизацию) входящих данных на разных этапах обработки, используя стандартные функции WordPress и собственные решения.
Почему проверка и очистка данных важны для WordPress
Входящие данные поступают из множества источников: формы, URL-параметры, AJAX-запросы, REST API, куки и т.д. Если не фильтровать и не валидировать эти данные, злоумышленники могут внедрить вредоносный код или нарушить логику работы сайта.
WordPress предлагает встроенные функции для защиты, но разработчик должен грамотно их использовать и дополнять кастомными проверками.
Проверка (валидация) отвечает на вопрос: «Данные корректны и соответствуют ожиданиям?» Очистка (санитизация) — это удаление нежелательных или опасных символов.
Основные функции WordPress для очистки и проверки данных
Для начала рассмотрим самые часто используемые функции:
sanitize_text_field()— удаляет HTML, PHP-теги и лишние пробелы из текстовых полей.sanitize_email()— проверяет и очищает email-адрес.sanitize_textarea_field()— для многострочного текста.esc_url_raw()— очищает URL для записи в базу.intval(),floatval()— для чисел.wp_kses()— позволяет задать список разрешённых HTML-тегов и атрибутов.is_email()— проверка валидности email.filter_var()с фильтрами PHP для дополнительной проверки.
Пример простой функции для очистки пользовательского ввода из формы:
function wpset_sanitize_user_input($data) {
$clean = array();
$clean['name'] = sanitize_text_field($data['name']);
$clean['email'] = sanitize_email($data['email']);
$clean['message'] = sanitize_textarea_field($data['message']);
return $clean;
}Добавляем валидацию на сервере: пример для формы обратной связи
Валидация проверяет логику и формат данных. Например, поле email должно содержать корректный email, а возраст — число в определённом диапазоне.
Пример функции с валидацией и возвратом ошибок:
function wpset_validate_contact_form($data) {
$errors = array();
if (empty($data['name'])) {
$errors['name'] = 'Укажите имя';
}
if (empty($data['email']) || !is_email($data['email'])) {
$errors['email'] = 'Введите корректный email';
}
if (!empty($data['age']) && (!is_numeric($data['age']) || $data['age'] < 18 || $data['age'] > 100)) {
$errors['age'] = 'Возраст должен быть числом от 18 до 100';
}
if (empty($data['message'])) {
$errors['message'] = 'Введите сообщение';
}
return $errors;
}В реальной обработке формы сначала вызываем wpset_validate_contact_form(), а затем, если ошибок нет, очищаем данные с помощью функции очистки и записываем их или отправляем.
Использование nonce и проверка прав доступа
Для безопасности форм важно использовать wp_nonce_field() и проверять nonce на сервере через check_admin_referer() или wp_verify_nonce(). Это предотвращает CSRF-атаки.
Пример добавления nonce в форму:
<form method="post" action="">
<?php wp_nonce_field('wpset_contact_form_action', 'wpset_contact_form_nonce'); ?>
<input type="text" name="name" />
<input type="email" name="email" />
<textarea name="message"></textarea>
<button type="submit">Отправить</button>
</form>Проверка nonce в обработчике:
if (!isset($_POST['wpset_contact_form_nonce']) || !wp_verify_nonce($_POST['wpset_contact_form_nonce'], 'wpset_contact_form_action')) {
wp_die('Ошибка безопасности. Повторите попытку.');
}Обработка AJAX-запросов с проверкой и очисткой данных
При работе с AJAX нужно всегда проверять nonce и валидировать данные на сервере. Пример обработки AJAX-запроса с проверкой nonce и очисткой:
add_action('wp_ajax_wpset_submit_form', 'wpset_handle_ajax_form');
add_action('wp_ajax_nopriv_wpset_submit_form', 'wpset_handle_ajax_form');
function wpset_handle_ajax_form() {
check_ajax_referer('wpset_ajax_nonce', 'nonce');
$data = array(
'name' => sanitize_text_field($_POST['name']),
'email' => sanitize_email($_POST['email']),
'message' => sanitize_textarea_field($_POST['message']),
);
$errors = wpset_validate_contact_form($data);
if (!empty($errors)) {
wp_send_json_error(array('errors' => $errors));
}
// Здесь логика сохранения или отправки данных
wp_send_json_success(array('message' => 'Форма успешно отправлена'));
}Использование плагина Clearfy Pro для улучшения безопасности и очистки данных
Плагин Clearfy Pro предлагает расширенные возможности для безопасности, оптимизации и очистки кода сайта. Он помогает отключать ненужные REST API endpoint’ы, очищать ненужные данные и добавлять дополнительные уровни защиты.
Использование Clearfy в связке с собственными функциями очистки позволяет максимально снизить риски уязвимостей.
Как создать универсальную функцию очистки и проверки для разных типов данных
Часто полезно иметь одну функцию, которая по типу поля будет подбирать нужный фильтр. Пример универсальной функции:
function wpset_sanitize_and_validate($field, $value) {
switch ($field) {
case 'email':
$value = sanitize_email($value);
if (!is_email($value)) return false;
break;
case 'url':
$value = esc_url_raw($value);
break;
case 'int':
$value = intval($value);
break;
case 'text':
$value = sanitize_text_field($value);
break;
case 'textarea':
$value = sanitize_textarea_field($value);
break;
default:
$value = sanitize_text_field($value);
}
return $value;
}Такую функцию удобно использовать при обработке массивов с данными.
Резюме: лучшие практики работы с входящими данными в WordPress
- Всегда очищайте данные перед сохранением или выводом.
- Проверяйте корректность формата и логики данных.
- Используйте nonce для защиты форм и AJAX-запросов.
- Применяйте универсальные функции для снижения дублирования кода.
- Используйте стандартные функции WordPress, дополняя их кастомными проверками.
- Рассмотрите применение плагинов безопасности, таких как Clearfy Pro, для дополнительной защиты.
Соблюдая эти рекомендации, вы значительно повысите безопасность и стабильность вашего WordPress-сайта, а также упростите поддержку и развитие кода.