В современных проектах на WordPress часто возникает необходимость создавать формы для сбора данных пользователей — будь то формы обратной связи, регистрации, подписки или кастомные формы для специфических задач. При этом очень важно обеспечить безопасность обработки данных, чтобы избежать уязвимостей, таких как CSRF, XSS и SQL-инъекции. В этой статье мы подробно рассмотрим, как создать защищённый формуляр обработки данных в WordPress с использованием собственных функций и API платформы.
Основы создания форм в WordPress: ключевые моменты безопасности
Формы в WordPress можно создавать разными способами: с помощью плагинов, через шорткоды, напрямую в шаблонах тем или в плагинах. Но в любом случае необходимо учитывать несколько важных аспектов безопасности:
- Использование
nonce— специальных защитных кодов, предотвращающих CSRF-атаки. - Очистка и валидация пользовательских данных перед сохранением или выводом.
- Правильное использование функций WordPress для работы с базой данных.
- Безопасный вывод данных с экранированием HTML и специальных символов.
Далее мы создадим пример защищённой формы с нуля, используя нонсы и функции очистки данных.
Создание формы обратной связи с защитой: пошаговое руководство
Для примера создадим простую форму обратной связи с полями «Имя», «Email» и «Сообщение». Форма будет выводиться через шорткод, а данные обрабатываться в функции, зарегистрированной на hook admin_post_nopriv и admin_post. Это стандартный способ обработки POST-запросов в WordPress.
Шаг 1. Создаём шорткод для вывода формы
Добавим в файл functions.php вашей темы или в плагин следующий код:
function wpma_render_contact_form() {
ob_start();
?>
<form action="<?php echo esc_url(admin_url('admin-post.php')); ?>" method="POST">
<?php wp_nonce_field('wpma_contact_form_action', 'wpma_contact_form_nonce'); ?>
<p>
<label for="wpma_name">Имя:</label><br>
<input type="text" id="wpma_name" name="wpma_name" required>
</p>
<p>
<label for="wpma_email">Email:</label><br>
<input type="email" id="wpma_email" name="wpma_email" required>
</p>
<p>
<label for="wpma_message">Сообщение:</label><br>
<textarea id="wpma_message" name="wpma_message" rows="5" required></textarea>
</p>
<input type="hidden" name="action" value="wpma_handle_contact_form">
<p><input type="submit" value="Отправить"></p>
</form>
<?php
return ob_get_clean();
}
add_shortcode('wpma_contact_form', 'wpma_render_contact_form');
Здесь мы создаём форму, которая отправляет POST-запрос на admin-post.php с параметром action=wpma_handle_contact_form. Также используем функцию wp_nonce_field для добавления защищённого nonce.
Шаг 2. Обработка данных формы с проверкой nonce и валидацией
Теперь добавим обработчик данных, который будет вызываться при отправке формы:
function wpma_handle_contact_form() {
// Проверяем nonce
if (!isset($_POST['wpma_contact_form_nonce']) || !wp_verify_nonce($_POST['wpma_contact_form_nonce'], 'wpma_contact_form_action')) {
wp_die('Ошибка безопасности: неверный проверочный код.');
}
// Чистим и валидируем данные
$name = sanitize_text_field($_POST['wpma_name'] ?? '');
$email = sanitize_email($_POST['wpma_email'] ?? '');
$message = sanitize_textarea_field($_POST['wpma_message'] ?? '');
if (empty($name) || empty($email) || empty($message) || !is_email($email)) {
wp_die('Пожалуйста, заполните форму корректно.');
}
// Здесь можно сохранить данные в базу, отправить письмо или выполнить другое действие
$to = get_option('admin_email');
$subject = 'Новое сообщение с сайта';
$headers = ['Content-Type: text/html; charset=UTF-8', 'From: ' . $name . ' <' . $email . '>'];
$body = '<p><strong>Имя:</strong> ' . esc_html($name) . '</p>' .
'<p><strong>Email:</strong> ' . esc_html($email) . '</p>' .
'<p><strong>Сообщение:</strong><br>' . nl2br(esc_html($message)) . '</p>';
wp_mail($to, $subject, $body, $headers);
wp_redirect(home_url('/thank-you/'));
exit;
}
add_action('admin_post_nopriv_wpma_handle_contact_form', 'wpma_handle_contact_form');
add_action('admin_post_wpma_handle_contact_form', 'wpma_handle_contact_form');
Здесь мы:
- Проверяем nonce для защиты от CSRF.
- Очистили и проверили поля с помощью функций WordPress:
sanitize_text_field,sanitize_email,sanitize_textarea_fieldиis_email. - Отправляем письмо администратору сайта через
wp_mailс корректными заголовками. - Перенаправляем пользователя на страницу благодарности.
Дополнительные меры безопасности и улучшения
Использование reCAPTCHA для защиты от спама
Чтобы уменьшить вероятность отправки спам-запросов, можно интегрировать Google reCAPTCHA. Для этого потребуется добавить на форму виджет reCAPTCHA и проверить ответ на сервере. Это значительно повысит безопасность и качество собранных данных.
Пример простого подключения reCAPTCHA v2:
- В форме добавьте перед кнопкой submit:
<div class="g-recaptcha" data-sitekey="ВАШ_SITE_KEY"></div> - Подключите скрипт в футере:
<script src="https://www.google.com/recaptcha/api.js" async defer></script> - В обработчике добавьте проверку ответа с помощью
wp_remote_postк API Google.
Сохранение данных в базе с использованием $wpdb
Если нужно сохранить данные в собственной таблице, лучше использовать объект $wpdb для безопасного взаимодействия с базой данных:
global $wpdb;
$table = $wpdb->prefix . 'wpma_contacts';
$wpdb->insert(
$table,
[
'name' => $name,
'email' => $email,
'message' => $message,
'created_at' => current_time('mysql')
],
['%s', '%s', '%s', '%s']
);
Перед этим необходимо создать таблицу при активации плагина или темы.
Рекомендуемые плагины для создания и защиты форм в WordPress
Если вы предпочитаете использовать готовые решения, рассмотрите следующие популярные плагины с хорошей безопасностью:
- Contact Form 7 — мощный и гибкий, поддерживает интеграцию с reCAPTCHA и различные расширения.
- WPForms — удобный конструктор форм с защитой от спама и интеграцией с почтовыми сервисами.
- Gravity Forms — премиум-решение с расширенными возможностями и встроенными мерами безопасности.
Однако знание основ создания и защиты форм вручную позволяет лучше понять, как работают эти плагины и как при необходимости доработать их под свои задачи.
Итоговые рекомендации по безопасности форм WordPress
Подводя итоги, чтобы создать защищённый формуляр обработки данных в WordPress, обязательно:
- Используйте
nonceдля защиты от CSRF. - Очищайте и валидируйте все входящие данные с помощью встроенных функций WordPress.
- Используйте безопасные методы работы с базой данных через
$wpdbили API WordPress. - Экранируйте пользовательские данные при выводе.
- Рассмотрите интеграцию систем антиспама, например reCAPTCHA.
- При возможности используйте проверенные плагины, но не забывайте контролировать безопасность.