Контактные формы WordPress: список проверок безопасности
Contact Form 7, WPForms, Gravity Forms, Ninja Forms или Fluent Forms — выбор плагина менее важен, чем его настройка и обслуживание. Что проверять и перепроверять после каждого обновления.
Большинство сайтов WordPress использует один из немногих плагинов форм: Contact Form 7, WPForms, Gravity Forms, Ninja Forms, Fluent Forms и несколько других. Любой можно эксплуатировать безопасно или оставить полностью открытым. Разница редко в самом плагине, а в настройках, дополнениях вокруг него, способе ухода почты с сервера и судьбе сообщений после поступления.
- Обновляйте плагин формы и каждое дополнение и удаляйте больше не используемые.
- Включите собственный антиспам плагина: honeypot, интеграцию CAPTCHA, Akismet при уместности — и подтвердите, что он реально работает.
- Отправляйте уведомления через SMTP с аутентификацией с адреса собственного домена.
- Ограничивайте загрузки по типу и размеру, не допускайте публичного перечисления или просмотра загруженных файлов.
- Не размещайте адрес электронной почты получателя на странице и в её исходном коде.
- Храните только нужные записи и только необходимое время.
- Выполняйте короткую проверку после каждого обновления WordPress, темы или любого плагина.
Обновления: плагин формы и всё вокруг него
Плагины форм — популярная цель, поскольку принимают ввод от любого человека в интернете. Исправления безопасности приходят обычными обновлениями, поэтому обновляйте быстро — и не только основной плагин. Дополнения для платежей, загрузок, связи с CRM, условной логики или дополнительных поставщиков CAPTCHA — отдельный код со своими уязвимостями. Как и плагины, однажды поставленные для теста и забытые. Деактивации недостаточно: неактивные плагины остаются на сервере, и в некоторых случаях их файлы доступны напрямую. Если не используете — удалите.
Антиспам: включите, затем докажите работу
Большинство плагинов форм имеет свои антиспам-настройки или интеграции с внешними сервисами: поле honeypot, заполняемое ботами и невидимое людям, CAPTCHA вроде reCAPTCHA, hCaptcha или Cloudflare Turnstile и Akismet, сверяющий содержимое сообщения с базой спама. Варианты зависят от плагина и версии, поэтому проверьте настройки, а не предполагайте. Внешние CAPTCHA загружают сторонние скрипты, а Akismet передаёт отправленное содержимое внешнему сервису — оба должны быть в политике конфиденциальности и, в зависимости от настройки, управлении согласием.
Более частая проблема — включённая, но неработающая защита. CAPTCHA с публичными тестовыми ключами пропускает всё. Виджет, скрипт которого заблокирован плагином кеширования или оптимизации либо ошибкой JavaScript, ничего не останавливает. Поле honeypot без скрывающих стилей озвучивается программами экранного доступа и заполняется настоящими посетителями. Поэтому после любого изменения откройте форму в приватном окне, проверьте консоль браузера и исходный код страницы, отправьте тестовое сообщение. Для независимой от Google защиты бесплатный плагин formexposed для WordPress добавляет honeypot, проверку времени и proof-of-work и перепроверяет сайт после обновлений плагинов — один из нескольких вариантов.
Почта: как отправляется и куда идёт
По умолчанию WordPress передаёт почту функции PHP mail сервера, и на многих хостингах эти сообщения плохо аутентифицируются и попадают в спам или молча исчезают. Вместо этого отправляйте через SMTP-плагин или почтовый сервис хостинга с настоящим ящиком, именем пользователя и паролем и адресом отправителя на своём домене, например отдельным адресом forms@. Записи SPF, DKIM и DMARC домена должны охватывать этого отправителя. Не ставьте адрес посетителя в From: это не Ваш домен, поэтому письмо не может пройти согласование DMARC и в зависимости от политики домена посетителя попадает в спам или отклоняется. Укажите его в Reply-To, и Вы по-прежнему сможете ответить одним нажатием.
Адрес получателя должен быть в настройках плагина, а не на странице. Проверьте исходный код контактной страницы: ссылка mailto рядом с формой или скрытое поле с адресом получателя передаёт этот адрес каждому собирающему боту. В старых или самописных формах бывает хуже: если сервер доверяет скрытому полю получателя, любой может изменить его и использовать Вашу форму для отправки почты на произвольные адреса.
Загрузки и сохранённые записи
Загрузка файлов — самая рискованная функция формы, поэтому сначала спросите, нужна ли она вообще. Если нужна, разрешайте только действительно ожидаемые типы, например PDF и распространённые изображения, вместо блокировки нескольких опасных, и установите лимит размера. Проверьте место хранения загрузок: их нельзя перечислять в публичном каталоге, а в идеале они вовсе не должны быть доступны по угадываемому адресу. Удаляйте после обработки или отправляйте вложениями вместо хранения на сервере.
Многие плагины форм или дополнения сохраняют каждую отправку в базе WordPress, часто включая спам. Это полезный резерв при сбое почты, но также растущая куча персональных данных. По принципу ограничения хранения GDPR (ст. 5(1)(e)) их нельзя хранить дольше необходимого. Определите необходимость сохранённых записей, поля и срок, затем используйте автоудаление плагина при наличии или регулярно удаляйте старые записи. Резервные копии базы содержат те же данные.
После каждого обновления
- 1Откройте контактную страницу в приватном окне: форма и антиспам-элемент отображаются правильно, а консоль браузера не показывает ошибок.
- 2Посмотрите исходный код: поле honeypot и скрипт CAPTCHA всё ещё есть, а адреса получателя нет.
- 3Отправьте тестовое сообщение: оно приходит во входящие, не в спам, а заголовки показывают успешные SPF, DKIM и DMARC.
- 4Проверьте важные настройки: получателя, адрес отправителя, разрешённые типы и размеры загрузок, срок хранения записей.
- 5Проверьте, что ссылка политики конфиденциальности и текст согласия всё ещё показаны у формы.
- 6Запишите дату и проверенные пункты, чтобы знать, когда форма в последний раз доказанно работала.
Став привычкой, это занимает мало времени и улавливает именно тихие сбои, иначе незаметные неделями. Для взгляда снаружи бесплатная проверка на formexposed.com смотрит публичные страницы форм сайта, ничего не отправляя, и показывает наличие и эффективную настройку ожидаемой защиты — без аккаунта.