Защита от спам-ботов
Спам приходит на сайт не от людей, а от скриптов, которые за секунду перебирают тысячи форм в интернете. Их не останавливают вежливые просьбы и капча-заглушки без проверки на сервере — только конкретные технические барьеры, которые вы контролируете сами.
Google reCAPTCHA
Самый распространённый способ. reCAPTCHA v2 показывает пользователю чекбокс «Я не робот» или набор картинок, v3 работает невидимо и присваивает каждому запросу число от 0 до 1 — вероятность, что перед вами человек. Порог отсечения вы задаёте сами, обычно 0.5.
Проверка на сервере
Виджет на странице — это только половина защиты. Токен, который он присылает, нужно передать на сервер и проверить запросом к API Google, иначе форму пройдёт любой бот, который скопирует чужой валидный токен из исходного кода страницы.
curl -X POST https://www.google.com/recaptcha/api/siteverify \
-d secret=ВАШ_СЕКРЕТНЫЙ_КЛЮЧ \
-d response=ТОКЕН_ИЗ_ФОРМЫ
# Ответ при неверном секретном ключе:
{"success": false, "error-codes": ["invalid-input-secret"]}
# Ответ при истёкшем или повторно использованном токене:
{"success": false, "error-codes": ["timeout-or-duplicate"]}
invalid-input-secret значит, что секретный ключ в запросе не совпадает с ключом сайта в консоли Google — часто путают ключ теста и продакшна. timeout-or-duplicate — токен уже был использован или устарел (живёт около двух минут), это нормально при повторной отправке формы после ошибки валидации.
Подключая reCAPTCHA, вы передаёте данные посетителя (IP-адрес, поведение на странице) сервису Google — это нужно указать в политике конфиденциальности сайта, иначе нарушается требование о прозрачности обработки данных третьими сторонами. Cloudflare Turnstile передаёт меньше данных и часто работает вовсе без визуальной проверки, что делает его более приватной альтернативой для сайтов, ориентированных на Евросоюз.
Honeypot-поле
Добавьте скрытое поле в форму — боты его заполняют, люди нет:
<input type="text" name="website" style="position:absolute;left:-9999px" tabindex="-1" autocomplete="off" aria-hidden="true">
На сервере просто проверяете: если поле website не пустое — это бот, отбрасывайте запрос без ошибки (боту не нужно знать, что его вычислили).
Типичные ошибки настройки
Проверка только в браузере
Если код на JavaScript просто прячет кнопку отправки, пока капча не пройдена, а сервер токен не проверяет — это защита от честных пользователей, а не от ботов. Бот отправляет POST-запрос напрямую, минуя браузер и вашу JS-проверку целиком.
display:none вместо смещения за экран
<!-- Часть автозаполнителей браузера игнорирует display:none и всё равно
подставляет туда сохранённый email пользователя -->
<input type="text" name="email2" style="display:none">
<!-- Смещение за пределы экрана надёжнее для тех же целей -->
<input type="text" name="email2" style="position:absolute;left:-9999px">
Сравнение методов защиты
| Метод | Нужен JavaScript | Видим пользователю | Передаёт данные третьей стороне |
|---|---|---|---|
| reCAPTCHA v2 | Да | Да, чекбокс или картинки | Да, Google |
| reCAPTCHA v3 | Да | Нет | Да, Google |
| Cloudflare Turnstile | Да | Обычно нет | Да, Cloudflare |
| Honeypot-поле | Нет | Нет | Нет |
Honeypot ничего не отправляет наружу и не требует согласия на обработку данных третьей стороной, но справляется только с примитивными ботами, которые заполняют все поля подряд. Против целевого спама на конкретный сайт его комбинируют с reCAPTCHA или Turnstile.
Когда антиспам-меры не спасут
- Ручной спам, который оставляют живые люди за небольшую плату — ни одна капча не отличит такого человека от обычного посетителя.
- Атака через API сайта в обход HTML-формы: если endpoint принимает те же поля напрямую, honeypot и виджет капчи на странице бесполезны — проверка нужна и на самом API.
- Устаревшая версия плагина антиспама с известной уязвимостью обхода — регулярные обновления обязательны, сама по себе капча не патчит дыры в коде.
Ещё один честный момент: любая видимая капча снижает конверсию формы — часть живых посетителей уходит, не разобравшись с картинками или не дождавшись загрузки виджета на медленном соединении. Невидимая reCAPTCHA v3 и honeypot этой проблемы почти не создают именно потому, что не требуют действий от человека.
Для WordPress
- Akismet — защита комментариев, обучается на базе миллионов сайтов
- WPForms с reCAPTCHA — защита форм обратной связи
- Cloudflare — защита на уровне DNS/CDN до того, как запрос дойдёт до WordPress
Проверка, что защита работает
- Отправьте форму без заполнения honeypot-поля — она должна пройти как обычно.
- Заполните honeypot вручную через консоль разработчика браузера и отправьте форму — она должна быть отклонена.
- Проверьте лог сервера на ответы
invalid-input-secretиtimeout-or-duplicateот Google — их отсутствие не значит, что проверка работает, убедитесь, что код действительно делает запрос кsiteverify, а не только сверяет наличие токена. - Через неделю сравните число заявок в базе с числом заполнений формы в аналитике — резкий разрыв укажет, что бот всё ещё проходит.
Подробнее о защите WordPress от взлома — в статье жёсткая защита WordPress, а про фильтрацию вредоносного трафика на уровне веб-сервера — в разборе ModSecurity WAF.