Перейти к содержимому
FFormhook
Назад к блогу

Блог

Спам в формах: honeypot, ограничение частоты и Turnstile

· 3 мин чтения

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

Знай своего врага: три типа спама в формах

  1. Тупые краулеры - скрипты, которые находят каждую <form> в интернете и заваливают POST-запросами URL действия. Они заполняют каждое поле, которое видят. Это подавляющее большинство объёма.
  2. Целевые потоки - кто-то (или чей-то ботнет) целенаправленно долбит именно ваш эндпоинт, часто просто потому, что он существует.
  3. Человеческие спам-фермы - реальные люди, которым платят за заполнение форм. Редкость для контактных форм; ни одна автоматическая защита не останавливает их полностью, и это нормально - они статистическая погрешность.

Каждый слой ниже соответствует одному из этих случаев.

Слой 1: honeypot (останавливает краулеров)

Honeypot - это дополнительное поле, которое люди никогда не видят - оно скрыто через CSS, - но которое тупые боты послушно заполняют, потому что оно есть в разметке:

<input type="text" name="website" tabindex="-1" autocomplete="off"
       style="position:absolute;left:-9999px" aria-hidden="true">

Правило на стороне сервера: если это поле пришло непустым, отправка - спам. Молча примите её (верните 200) и отбросьте, чтобы бот ничему не научился. Один этот трюк устраняет большую часть спама с нулевым трением для людей - ни загадок, ни кликов, ничего.

Детали, которые важны: дайте ему заманчивое имя (website, phone2), уберите его из порядка табуляции и пометьте aria-hidden, чтобы скринридеры его пропускали - невидимость должна быть и для средств доступности, а не только визуальной.

Слой 2: ограничение частоты (останавливает потоки)

Honeypot не поможет, когда бот отправляет POST с внешне валидными данными 500 раз в минуту. А вот ограничения частоты по IP и по форме - помогут: реальный человек не отправляет контактную форму десять раз за шестьдесят секунд, так что при троттлинге ничего ценного не теряется. Лимиты должны применяться на принимающем эндпоинте, до сохранения и уведомлений - иначе поток всё равно завалит ваш почтовый ящик, даже если помечен как спам.

Слой 3: Turnstile (когда давление требует проверки)

Когда форма привлекает более умных ботов - headless-браузеры, которые рендерят CSS и обходят ваш honeypot, - вы переходите к проверке (challenge). Cloudflare Turnstile - современный выбор: он подтверждает человечность через сигналы браузера и обычно проходит незаметно, без фотозагадок с пожарными гидрантами. Процесс стандартный: виджет на вашей странице выдаёт токен, принимающий сервер проверяет токен через Cloudflare, а отправки без действительного токена отклоняются.

Turnstile - это слой, который стоит добавлять по мере необходимости, а не заранее - любая проверка, даже самая мягкая, стоит немного конверсии.

Как это выглядит, когда это чья-то ещё работа

Если вы сами обслуживаете приём форм, вы реализуете все три слоя - плюс поддерживаете их в рабочем состоянии вечно. Это большая часть того, для чего нужен бэкенд форм. Formhook по умолчанию поставляет honeypot, ограничения частоты по IP и по форме (rate limits) и allowlist CORS по форме на каждом тарифе, включая Free; Turnstile - это чекбокс в настройках формы, когда вам нужен дополнительный слой.

Какой бы путь вы ни выбрали, стратегия одна: сначала невидимая защита, человеко-ориентированные проверки - в последнюю очередь, и никогда не начинайте с CAPTCHA.

Рабочая форма в одну строку

Размещение в ЕС, отправки хранятся вечно, push-уведомления на любом тарифе.

Начать бесплатно

Без банковской карты · читайте документацию

Читать дальше