Как защитить формы сайта от спама и автоматических атак

Многоуровневая защита формы сайта: фильтр, проверка запроса и передача настоящей заявки
Содержание 19 разделов

Рабочий набор решений — от бесплатного honeypot-поля до WAF — с поправкой на российскую специфику

Надёжная защита формы строится слоями: серверная проверка полей, скрытые сигналы для простых ботов, ограничение частоты, журналы и CAPTCHA только для подозрительных запросов. После настройки важно убедиться, что настоящие заявки по-прежнему доходят. [1][2]

Что такое спам-боты и автоматические атаки на формы

Спам-бот в контексте веб-форм — это программа (скрипт, headless-браузер или облачный сервис для обхода капчи), которая заполняет и отправляет форму так же, как это делает человек, но массово и без участия человека. Цель может быть разной: разместить ссылку в комментариях, создать фиктивный аккаунт, забить базу мусорными лидами, перебрать пароли на форме входа, «выжать» дорогой запрос к серверу или просто проверить, есть ли на сайте вообще какая-либо защита .

Отраслевой стандарт классификации таких угроз — OWASP Automated Threats to Web Applications Project. В его таблице (OAT — OWASP Automated Threat) отдельно выделены, среди прочего: спам-рассылки в открытых полях сайта (Spamming), массовое создание аккаунтов (Account Creation), подбор логинов и паролей (Credential Cracking), обход антибот-проверок (CAPTCHA Bypass) и перегрузка ресурсов сервера или отдельных аккаунтов (Denial of Service) . Смысл этой классификации не академический: понимание, с каким именно типом угрозы вы имеете дело, определяет, какой уровень защиты вообще имеет смысл настраивать — от простого невидимого поля до полноценного WAF.

Как боты технически атакуют формы

Стоит разделять ботов на два класса — от этого зависит, какая защита будет эффективна.

Простые скрипты. Такой бот не запускает JavaScript и не рендерит страницу как браузер — он просто разбирает HTML-код формы и отправляет POST-запрос со значениями во все найденные поля, включая скрытые. Именно эта особенность и лежит в основе honeypot-метода: скрытое от людей поле такой бот заполнит «на автомате», а обычный посетитель — никогда, потому что физически его не увидит .

«Умные» боты и headless-браузеры. Более продвинутые сценарии используют headless-браузеры (например, на основе Chromium), которые выполняют JavaScript, эмулируют движения мыши и задержки между действиями, а иногда обращаются к сторонним сервисам распознавания капчи — платным API или «фермам» живых людей, решающим капчу за вознаграждение. Против такого бота простой honeypot и статичная капча уже не гарантируют защиты — нужен поведенческий анализ (движения курсора, скорость заполнения, паттерны запросов), которым и занимаются современные антибот-сервисы вроде Yandex SmartCaptcha и Cloudflare Turnstile .

Доступность и отказоустойчивость защиты

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

Ключи и правила держат на серверной стороне. Клиентская проверка улучшает интерфейс, однако окончательное решение о приёме запроса принимает backend.

Уровни защиты и как их реализовать

Уровень 1. Серверная проверка и скрытые сигналы

Backend проверяет обязательные поля, формат, допустимый размер и повторные отправки. Honeypot и время заполнения помогают отсечь простых ботов, но не используются как единственное условие.

Уровень 2. Ограничение частоты и наблюдаемость

Лимиты задают отдельно для endpoint формы и дополняют признаками IP, сессии или учётной записи. В NGINX модуль limit_req использует алгоритм leaky bucket; по умолчанию отклонённый запрос получает 503. Для ответа 429 его задают явно через limit_req_status 429. [3][4]

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

Уровень 3. CAPTCHA для подозрительных запросов

SmartCaptcha использует публичный клиентский ключ и секретный серверный ключ. Одноразовый токен действует пять минут, а результат проверяет backend. Пользователю нужен доступный альтернативный путь, если визуальная задача недоступна. [5][6] [8]

Уровень 4. WAF и защита приложения

При распределённой атаке правила одной формы дополняют WAF и ограничением запросов на уровне приложения. Сценарии проверяют в режиме наблюдения, затем включают блокировку и контролируют ложные срабатывания. [7]

Почему признаки нужно комбинировать

IP-адрес нельзя считать устойчивым идентификатором: за одним адресом могут находиться сотрудники офиса или абоненты мобильной сети, а распределённый ботнет, наоборот, меняет адрес при каждом запросе. Cookie и сессия тоже легко сбрасываются. Поэтому решение лучше принимать по совокупности признаков: частоте, повторяемости данных, времени заполнения, последовательности действий и результату CAPTCHA.

Правила разделяют по риску. Для обычной формы обратной связи достаточно мягкого ограничения и проверки доставки. Форма регистрации, восстановления пароля или отправки SMS требует отдельных лимитов на endpoint, учётную запись и целевой номер. API, которое изменяет данные, дополнительно проверяет авторизацию и права пользователя.

Что журналировать

Полезная запись содержит время, маршрут, код решения, сработавшее правило, сокращённый технический идентификатор и результат передачи заявки дальше. Содержимое сообщения, пароль, полный токен CAPTCHA и другие секреты в журнал не попадают. Срок хранения выбирают по цели расследования и внутренним правилам проекта.

Отдельная метрика показывает долю принятых, отклонённых и ошибочных запросов. Если после включения правила число успешных обращений резко упало, это повод проверить порог, доступность внешнего компонента и маршрут доставки, а не считать все отклонения ботами.

Практические этапы внедрения

  1. Собрать список форм, API-методов и действий, которые запускаются после отправки.
  2. Настроить серверную валидацию, ограничения размера и безопасную обработку ошибок.
  3. Добавить honeypot и временной сигнал, не полагаясь на них в одиночку.
  4. Ввести отдельные лимиты для критичных endpoint и понятный ответ 429.
  5. Подключать CAPTCHA при подозрительном поведении и проверять токен на сервере.
  6. Настроить журналы и тестовую заявку, чтобы фильтр не скрывал сбой доставки.

CSRF-токен решает другую задачу: защищает изменяющий состояние запрос авторизованного браузера от подделки. Он нужен там, где применим CSRF, но не заменяет антибот-защиту. [9]

Как проверить результат перед публикацией

Тестируют обычную отправку с компьютера и телефона, повторный запрос, неверный формат, слишком большой текст, отсутствие JavaScript, недоступность CAPTCHA и превышение лимита. Для каждого сценария заранее известен ожидаемый HTTP-ответ и сообщение пользователю.

Затем отправляют контрольную настоящую заявку и прослеживают весь путь: браузер получил подтверждение, backend сохранил событие, интеграция приняла запрос, а сотрудник увидел обращение. Такая проверка выявляет ситуацию, когда форма визуально сообщает об успехе, но письмо или запись в CRM не создаётся.

Как запускать без потери заявок

Новые правила сначала включают в режим наблюдения: система помечает подозрительные запросы, но не отклоняет их. По журналу отделяют настоящие обращения от автоматических, корректируют пороги и только затем включают блокировку. Для критичных форм полезно оставить аварийный переключатель и заранее определить, кто может временно ослабить правило.

После запуска смотрят не только на объём спама, но и на конверсию формы, число ответов 429, ошибки внешнего сервиса и задержку обработки. Защита считается рабочей, когда снижает автоматический поток и одновременно сохраняет понятный путь для реального человека.

Ограничения, ошибки и риски

  • Один фильтр легко обойти. Работает сочетание независимых сигналов и серверного контроля.
  • Жёсткий лимит может потерять обращения. Порог проверяют на реальном трафике и отслеживают ошибки.
  • CAPTCHA влияет на доступность. Нужен понятный запасной способ связи.
  • Логи могут сами стать риском. В них не записывают пароли, токены и полное содержимое полей.
  • Успешная отправка интерфейса ещё не означает доставку. Контролируют весь маршрут до почты или CRM.

Как выбрать решение под свой проект

Для обычной формы разумная точка старта — серверная валидация, honeypot, ограничение частоты и журналы. CSRF-токен добавляют там, где запрос изменяет состояние в авторизованном браузере; он решает отдельную задачу и не заменяет антибот-защиту.

Если простые сигналы не справляются, подключают step-up CAPTCHA или WAF. Порог выбирают по журналам, а влияние проверяют контрольными заявками с разных устройств: защита должна снижать автоматический поток, сохраняя доставку настоящих обращений.

Как может помочь «Пятый фактор»

«Пятый фактор» может разобрать маршрут заявки от формы до почты или CRM, настроить серверную проверку, ограничения, SmartCaptcha или WAF и добавить технические события для контроля. После запуска мы отправляем тестовые обращения и проверяем, что защита блокирует заданные сценарии и сохраняет рабочую доставку реальных заявок.

Вывод

Защита формы строится из нескольких независимых слоёв: серверной проверки, ограничений частоты, дополнительных антибот-сигналов, журналов и CAPTCHA для подозрительных запросов. CSRF применяется по своему назначению, а результат настройки подтверждают тестами всего маршрута заявки.

Источники

[1] OWASP Bot Management and Anti-Automation Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Bot_Management_and_Anti-Automation_Cheat_Sheet.html

[2] OWASP Automated Threats to Web Applications — https://owasp.org/www-project-automated-threats-to-web-applications/

[3] NGINX — ngx_http_limit_req_module — https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

[4] RFC 6585 — HTTP 429 Too Many Requests — https://www.rfc-editor.org/rfc/rfc6585.html

[5] Yandex Cloud — проверка ответа SmartCaptcha — https://yandex.cloud/ru/docs/smartcaptcha/concepts/validation

[6] Yandex Cloud — ключи SmartCaptcha — https://yandex.cloud/ru/docs/smartcaptcha/concepts/keys

[7] Yandex Cloud — Smart Web Security — https://yandex.cloud/ru/docs/smartwebsecurity/

[8] W3C WCAG — Non-text Content — https://www.w3.org/WAI/WCAG21/Understanding/non-text-content

[9] OWASP Cross-Site Request Forgery Prevention Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

Нужна помощь по этой задаче?
На странице услуги «Антиспам для форм, комментариев и регистраций» указаны состав работ, результат и фиксированная цена.