Honeypot-поля в формах: защита от ботов без CAPTCHA
Honeypot-поле - это скрытый элемент веб-формы, который обычный пользователь не видит и не заполняет, а бот заполняет автоматически. Если при отправке формы это поле содержит данные, сервер понимает: отправка пришла от бота, а не от человека. Заявку можно отклонить молча, без каких-либо уведомлений.
Как работает honeypot-поле
Идея основана на разнице в поведении человека и программы. Человек видит форму визуально: два-три поля, кнопка отправки. Бот видит HTML-разметку целиком и заполняет все поля, которые находит, включая скрытые.
Технически honeypot реализуется так: в форму добавляется дополнительное поле ввода. Его скрывают через CSS (display: none или position: absolute с выносом за пределы экрана). В HTML оно выглядит как обычное текстовое поле, но на экране его нет.
Бот парсит DOM, находит поле, вписывает значение. Сервер получает форму, проверяет honeypot-поле. Если пустое - обрабатывает нормально. Если заполнено - отклоняет. Всё.
Honeypot против CAPTCHA
CAPTCHA работает, но раздражает пользователей. Исследования показывают, что добавление CAPTCHA на форму подписки снижает конверсию на 10-30%. Человек не хочет распознавать светофоры и автобусы, чтобы подписаться на рассылку. Часть людей просто уходит.
Honeypot невидим для пользователя. Никаких дополнительных действий, никаких задержек. Форма работает так, будто защиты нет. Но защита есть, и она отсекает значительную часть примитивных ботов.
Минус honeypot - продвинутые боты его обходят. Современные краулеры умеют анализировать CSS и пропускать скрытые поля. Headless-браузеры рендерят страницу и заполняют только видимые элементы. Поэтому honeypot - это первая линия защиты, а не единственная.
Как правильно реализовать
Не используйте name="honeypot" или id="trap" для скрытого поля. Боты давно научились фильтровать по таким именам. Назовите поле правдоподобно: "website", "company_url", "phone2". Что-то, что выглядит как реальное поле формы.
Скрывайте поле через CSS, а не через атрибут hidden или type="hidden". Атрибут hidden в HTML легко распознается парсерами. Type="hidden" тоже не подходит - боты знают, что скрытые поля не нужно заполнять. CSS-скрытие сложнее обнаружить без рендеринга страницы.
Добавьте для доступности атрибут tabindex="-1" и autocomplete="off". Иначе пользователь с клавиатурной навигацией может случайно попасть в скрытое поле, а автозаполнение браузера может подставить в него данные. Оба случая дадут ложное срабатывание.
Добавьте aria-hidden="true" и label с текстом вроде "Не заполняйте это поле". Это поможет пользователям скринридеров не запутаться.
Комбинирование с другими методами
Honeypot хорошо работает в связке с проверкой времени заполнения формы. Человек тратит на заполнение 5-15 секунд. Бот отправляет форму за 0.3 секунды. Если форма отправлена менее чем через 2 секунды после загрузки страницы - это почти наверняка бот.
Третий уровень - валидация email на стороне сервера. Даже если бот прошел honeypot и проверку времени, можно проверить введенный email: существует ли домен, есть ли MX-записи, не одноразовая ли это почта. Это добавляет надежности.
Четвертый уровень - double opt-in. Бот может ввести чужой email, но не может подтвердить подписку, потому что не имеет доступа к чужому ящику. Double opt-in отсекает всё, что прошло предыдущие фильтры.
Влияние на качество email-базы
Без защиты формы подписки боты могут засорить базу тысячами адресов за несколько дней. Среди них будут несуществующие ящики, спам-ловушки, чужие адреса. Отправка рассылки по такой базе гарантирует высокий bounce rate, жалобы на спам и падение репутации домена.
Honeypot-поле - самый простой способ предотвратить загрязнение базы на этапе сбора. Внедрение занимает 10 минут, не требует сторонних сервисов и не влияет на конверсию формы. Это минимум, который стоит сделать на любом сайте с формой подписки.
uChecker помогает очистить базу от адресов, которые проникли через формы без защиты. Валидация определяет несуществующие ящики, одноразовые почты, спам-ловушки и ролевые адреса. Но лучше не допускать мусор в базу, чем чистить его потом. Honeypot - первый шаг.
