К основному содержимому

Защита сайта от спама и ботов

Безопасность · 15.03.2025 · 4 мин чтения
Иллюстрация к статье «Защита сайта от спама и ботов»

Защита от спам-ботов

Спам приходит на сайт не от людей, а от скриптов, которые за секунду перебирают тысячи форм в интернете. Их не останавливают вежливые просьбы и капча-заглушки без проверки на сервере — только конкретные технические барьеры, которые вы контролируете сами.

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

Проверка, что защита работает

  1. Отправьте форму без заполнения honeypot-поля — она должна пройти как обычно.
  2. Заполните honeypot вручную через консоль разработчика браузера и отправьте форму — она должна быть отклонена.
  3. Проверьте лог сервера на ответы invalid-input-secret и timeout-or-duplicate от Google — их отсутствие не значит, что проверка работает, убедитесь, что код действительно делает запрос к siteverify, а не только сверяет наличие токена.
  4. Через неделю сравните число заявок в базе с числом заполнений формы в аналитике — резкий разрыв укажет, что бот всё ещё проходит.

Подробнее о защите WordPress от взлома — в статье жёсткая защита WordPress, а про фильтрацию вредоносного трафика на уровне веб-сервера — в разборе ModSecurity WAF.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке