Назад в блог
Основы Опубликовано 19.08.2026 1 мин чтения

Что действительно защищает форму: CAPTCHA, honeypot, временная ловушка, CSRF

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

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

Сравнение уровней защиты
Уровень и что он останавливает
  • Honeypot: простые боты, заполняющие каждое поле
  • Временная ловушка: скрипты, отправляющие сразу после загрузки
  • CAPTCHA: большинство универсальной автоматизации
  • Токен CSRF: запросы прямо на конечную точку
  • Ограничение частоты: потоки с одного источника
  • Proof-of-work: дешёвые массовые отправки, без отслеживания или головоломок
  • Серверные проверки: всё, что обходит браузер
Что пропускает или чего стоит
  • Целевые боты пропускают его; при плохом скрытии его озвучивают программы экранного доступа
  • Боты, которые ждут; без серверной подписи легко подделать
  • Препятствие для всех, барьеры доступности, часто сторонний сервис; существуют сервисы решения
  • Боты, сначала загружающие страницу, тоже получают действительный токен
  • Спам, распределённый между многими IP-адресами
  • Настойчивый отправитель с вычислительной мощностью; нужен JavaScript
  • Сами по себе ничего — но без них каждый другой уровень лишь украшение
Ни один уровень не охватывает всё. Недорогие невидимые уровни фильтруют основную массу; более тяжёлые нужны против настойчивого целевого спама.

Honeypot и временная ловушка: невидимые фильтры

Honeypot — дополнительное поле, которого люди никогда не видят, например поле «website», скрытое CSS. Простые боты заполняют каждое поле, поэтому заполненный honeypot указывает на автоматизацию и сервер может молча отбросить сообщение. Боты, написанные для Вашего сайта, или отображающие страницу как браузер, пропускают его. Скрывайте его правильно: поле, лишь вынесенное за экран, может озвучиваться программой экранного доступа, достигаться клавишей Tab или заполняться автозаполнением. Используйте aria-hidden, tabindex -1 и autocomplete off, а также нейтральную подпись с просьбой оставить поле пустым для тех, кто на него попадёт.

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

CAPTCHA: эффективна, но не бесплатна

CAPTCHA запрашивает доказательство отсутствия бота — от картинок-головоломок до фоновых проверок; распространённые сервисы — reCAPTCHA, hCaptcha, Cloudflare Turnstile и Friendly Captcha. Она останавливает большинство универсальной автоматизации, поэтому столь популярна. Но каждая видимая головоломка — препятствие, на котором часть посетителей сдаётся, а большинство сервисов загружает сторонний скрипт, поднимая вопросы конфиденциальности и согласия. CAPTCHA также помогает лишь при правильной настройке: публичный тестовый ключ сайта, виджет без скрипта или токен, который сервер никогда не проверяет, выглядят как защита, но ею не являются. Бесплатная проверка на formexposed.com указывает на такие ошибки снаружи.

Доступность — часть этой цены. Картинки-головоломки исключают незрячих и многих слабовидящих людей, аудиоальтернативы не помогают слепоглухим, а сложные логические задачи нагружают людей с когнитивными нарушениями. Критерий успешности 1.1.1 WCAG 2.2 требует текстовой альтернативы, описывающей назначение CAPTCHA, и альтернативных форм для разных чувств. Фоновые проверки избегают большей части этого, но при подозрении резервным вариантом часто снова становится визуальная головоломка — проверьте этот путь с клавиатурой и программой экранного доступа.

Токен CSRF: защита от подделки, а не спама

Токен CSRF — случайное значение, которое сервер помещает в форму и ожидает получить обратно. Он создан против межсайтовой подделки запросов, когда другой сайт заставляет браузер посетителя отправить запрос, которого посетитель не намеревался отправлять. На публичной контактной форме он имеет побочный эффект: боты, отправляющие прямо на адрес формы без загрузки страницы, отклоняются. Любой бот, получающий страницу и возвращающий токен, проходит. Большинство фреймворков и плагинов форм и так включает токены CSRF — оставляйте их включёнными, но не считайте защитой от спама.

Что должно происходить на сервере

Проверки только в браузере ничего не защищают
Всё, что работает лишь в браузере, — JavaScript-валидация, скрипт проверки honeypot, токен CAPTCHA, который никто не проверяет, — пропускается при прямой отправке запроса. Любое решение о приёме сообщения должно приниматься на сервере.
  • Повторно проверяйте каждое поле на сервере: обязательность, длину, формат электронной почты и отсутствие переводов строки в полях, попадающих в почтовые заголовки.
  • Проверяйте токены CAPTCHA и proof-of-work при каждой отправке, у выдавшего сервиса или в собственном коде, и отклоняйте повторно использованные токены.
  • Ограничивайте отправки по IP-адресу и временному окну. Это останавливает поток с одного источника; спам со многих адресов требует других уровней.
  • Рассмотрите proof-of-work: перед отправкой браузер решает небольшую вычислительную задачу. Посетители не видят головоломки, ничего не отслеживается, но массовая отправка дорожает.

Разумное сочетание: два или три уровня

  1. 1Начните с невидимых уровней: доступного honeypot и подписанной временной ловушки, оба с серверной проверкой.
  2. 2Добавьте ограничение частоты по IP-адресу, чтобы один источник не мог завалить форму.
  3. 3Если целевой спам всё ещё проходит, добавьте proof-of-work или CAPTCHA — желательно без видимой головоломки и с доступной альтернативой.
  4. 4Оставьте токен CSRF Вашего фреймворка — как дополнение, а не защиту.
  5. 5Проверьте результат как посетитель: только клавиатурой, с программой экранного доступа, на телефоне — и убедитесь, что реальные сообщения всё ещё доходят.

На многих сайтах honeypot, временная ловушка и ограничение частоты вместе уже убирают большую часть универсального спама без видимого препятствия; CAPTCHA остаётся резервом на случай, когда этого недостаточно. В WordPress бесплатный плагин formexposed сочетает honeypot, проверку времени и proof-of-work без Google. Чтобы увидеть форму снаружи — какие уровни есть и эффективно ли настроена CAPTCHA, — бесплатной проверке на formexposed.com нужен только домен, без аккаунта. Она не видит Ваш серверный код, поэтому серверная часть остаётся Вашей задачей.