Защита от спама без капчи: три уровня фильтрации заявок
10 лет alto.codes жил почти без защиты от спама, а потом пошли брутфорс и ддос заявками. Капчу ставить не хотелось, поэтому мы сделали защиту без неё. Скрытый чек-бокс, cookies и лимит запросов с одного IP вместе работают как защита от ботов на сайте, а менеджеры видят только реальные заявки.
Каптчу категорически не хотелось ставить. Бесит же невероятно, когда сидишь и 5 минут размечаешь автобусы на картинках. Поработай нейросетью.
Три уровня защиты от спама без капчи
В итоге сделали спам-защиту без каптчи близкую к идеальной. Строится она на нескольких уровнях фильтрации.
1. Абсолютно все заявки попадают в БД и хранятся там две недели. Это позволяет в случае чего убедиться, что фильтры работают корректно. А чистка всего, что старше 2 недели спасает от перенаполнения.
Скрытый чек-бокс: защита формы от спама
2. Заявки, которые прошли защиту со спрятанным чек-боксом, попадают мне на почту. На странице размещается чек-бокс скрытый для пользователя. Роботы его заполняют и заявка не уходит. Это самое простое решение, которое фильтрует 90% спама.
3. Мы о каждом профиле собираем данные о том откуда он пришел и сколько страниц посмотрел. Это всё сохраняется в cookies. Если кукис сохранились, то заявка попадает в CRM и в ТГ-чат менеджеров.
Дополнительно
— Блокируем дубли заявок
— Больше 3-х запросов в сутки с одного айпи
Что получилось
Наблюдаем за полётом несколько месяцев. Всё отлично. Спам прилетает пару раз в неделю мне в почту, но сильно внимание не отнимает. Менеджеры видят только реальные заявки.
———————
Не знаю, как у вас. А у нас каждый квартал в чате вопрос, как решить проблему со спамом на сайте клиента, чтобы каптчей не пугать пользователей. Рекомендую отправить это коллегам, чтобы они заранее знали и возможном решении.
Какие бывают способы отсечь спам в формах
Капча — самый заметный, но не единственный вариант. Большинство ботов отсекаются невидимыми для человека проверками, и пользователь о них даже не узнаёт.
Сравню методы, которые встречаются чаще всего.
| Метод | Как работает | Минус |
|---|---|---|
| Капча (reCAPTCHA, Яндекс SmartCaptcha) | Задание или скрытая оценка поведения | Раздражает людей, снижает конверсию формы |
| Honeypot — скрытое поле | Бот заполняет поле, невидимое человеку | Продвинутые боты его распознают |
| Ловушка по времени | Форму отправили быстрее 2–3 секунд — бот | Ложные срабатывания при автозаполнении |
| JS-токен | Без выполнения JavaScript форма не уходит | Не спасает от ботов на headless-браузерах |
| Лимит запросов с IP | Не больше N заявок в сутки | Мешает офисам за одним NAT |
| Поведенческие данные в cookies | Источник визита и число просмотренных страниц | Нужно согласие на cookies |
Невидимые ловушки для ботов
Я люблю такие методы за то, что они ничего не требуют от посетителя. Но у каждого есть детали, без которых он не работает.
Как сделать скрытое поле правильно
Поле лучше прятать не через display:none — часть ботов это проверяет, — а уводить за пределы экрана через CSS. Добавьте tabindex="-1" и autocomplete="off", чтобы туда не попал курсор и не подставился автозаполнением адрес. Для скринридеров — aria-hidden="true".
Название поля стоит делать правдоподобным: website, company, phone2. Бот охотнее заполняет то, что похоже на обычную форму.
Ловушка по времени и токен
При загрузке страницы сервер выдаёт метку времени, подписанную секретом. Если форма вернулась через 1 секунду, её заполнил не человек. Подпись нужна, чтобы метку нельзя было подделать.
Защита от ботов на сайте на уровне сервера
Если идёт брутфорс или ддос заявками, фильтровать только в форме поздно: запросы уже нагружают бэкенд и базу.
Тут помогают другие инструменты.
- Ограничение частоты запросов в nginx — модуль limit_req.
- fail2ban для блокировки IP после серии подозрительных запросов.
- Сервисы фильтрации трафика: Cloudflare, Qrator, DDoS-Guard. Они отсекают атаку до того, как она дойдёт до сервера.
- Отдельный эндпоинт для формы с жёсткими лимитами, чтобы атака на него не роняла весь сайт.
Пошагово: антиспам для формы заявки
Порядок, в котором я бы внедрял фильтры на новом проекте:
- Сохранять все заявки в базу до любой фильтрации и хранить ограниченный срок — у нас это две недели.
- Добавить скрытое поле. Это отсекает основную массу.
- Добавить ловушку по времени и блокировку дублей.
- Ввести лимит на число заявок с одного IP в сутки.
- Передавать в CRM и чат менеджеров только то, что прошло все уровни, а подозрительное — на почту ответственному.
- Раз в неделю смотреть отсеянное, чтобы не терять живых клиентов. Это 10–15 минут работы.
Персональные данные в логах
Хранить все заявки, включая спам, значит хранить персональные данные. По 152-ФЗ «О персональных данных» нужны согласие на обработку, политика конфиденциальности и понятный срок хранения. Автоматическая чистка через 14 дней закрывает последний пункт.
Как понять, что фильтры работают
Я смотрю на три числа. Сколько заявок пришло всего, сколько отсеяно и сколько из отсеянного оказалось живыми людьми. Последнее число проверяется вручную раз в неделю по сохранённым заявкам.
Если ложных срабатываний больше одного-двух в месяц, фильтр слишком жёсткий. Если менеджеры жалуются на мусор в CRM, слишком мягкий. Ещё полезно сравнивать число заявок до и после включения нового фильтра: резкое падение без атаки — повод проверить его настройки. Нормальное состояние — когда спам изредка приходит на почту ответственному и почти не отнимает внимания, а менеджеры видят только реальные обращения.
Типичные ошибки
Самая дорогая ошибка — фильтровать молча. Если отсеянные заявки нигде не сохраняются, вы никогда не узнаете, сколько реальных клиентов потеряли. Вторая — включить капчу на всех формах сразу после первой атаки и забыть её выключить.
Третья ошибка — блокировать по IP навсегда. Мобильные операторы раздают одни и те же адреса тысячам людей, поэтому блокировку лучше ставить на сутки и снимать автоматически. Офисы крупных компаний тоже выходят в интернет через один адрес, и сотня сотрудников клиента не должна упираться в лимит из трёх заявок.
Ещё один промах — проверять фильтры только на десктопе. Автозаполнение в мобильном Safari или Chrome иногда заполняет скрытые поля, и вместе с ботами отсекается часть реальных клиентов.
Вопросы и ответы
Как защитить форму от спама без капчи?
На странице размещается чек-бокс, скрытый для пользователя. Роботы его заполняют, и заявка не уходит, — это фильтрует 90% спама.
Как ещё отсекать ботов на сайте?
Мы собираем в cookies данные о том, откуда пришёл посетитель и сколько страниц посмотрел. Ещё блокируем дубли заявок и больше трёх запросов в сутки с одного IP.
Как проверить, что фильтры не режут реальные заявки?
Абсолютно все заявки попадают в базу и хранятся там две недели. Так можно убедиться, что фильтры работают корректно.