← Все постыНаписать

Защита от спама без капчи: три уровня фильтрации заявок

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.

Как проверить, что фильтры не режут реальные заявки?

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

Обсудить в Telegram Подписаться на @altocodes