Как работает скрытое поле honeypot
Чтобы правильно создать ловушку, сначала нужно задать себе вопрос:
Наша задача — сделать так, чтобы поле выглядело для «программы» обычной и вполне логичной частью формы.
У бота нет глаз в человеческом понимании. Обычно он анализирует HTML-код страницы, ищет формы, а внутри них — элементы для ввода данных.
Универсального поведения у ботов нет. Одни программы работают примитивно и стремятся заполнить самую первую форму в коде сайта, другие находят сразу несколько форм, третьи ориентируются на названия и типы полей, а некоторые используют браузеры без видимого интерфейса.
Формы могут содержать разные элементы: текстовые поля, выпадающие списки, чекбоксы, переключатели и кнопки. Для нашей простой ловушки нас прежде всего интересуют:
<input>— обычное поле в одну строку: имя, телефон, почта или адрес сайта;<textarea>— многострочное поле: комментарий, сообщение или описание.
В Тильде нам будет достаточно обычного поля для ввода в одну строку. Наша задача — добавить настоящее текстовое поле, оставить его внутри формы, но визуально убрать со страницы при помощи CSS.
Поле должно существовать в коде и быть доступным автоматической программе, но обычный посетитель сайта видеть его не должен.
Почему не стоит называть ловушку Email
Допустим, в форме уже есть имя и телефон, но нет электронной почты. На первый взгляд Email кажется идеальным вариантом для ловушки: поле распространённое, понятное и часто встречается в формах. Бот наверняка решит его заполнить...
Но здесь появляется другая проблема: поле email может заполнить не только бот, но и системы автоматического заполнения в браузерах.
Браузер может распознать название вроде email и самостоятельно подставить в невидимое поле адрес настоящего пользователя. В результате нормальная заявка будет ошибочно отмечена как спам. Кроме того, отдельный тип поля Email в Тильде автоматически проверяет формат адреса. Для скрытого поля такая проверка нам с вами совсем не нужна.
Я не рекомендую называть ловушку email, phone или другими именами, которые браузеры активно связывают с автозаполнением.
Не стоит использовать и слишком очевидные названия:
honeypot
bot_field
spam
trap
antibot Более умная программа может понять, зачем создано такое поле.
Лучше выбрать правдоподобное, но не слишком распространённое имя:
website
company_website
contact_url
website_url
url_site Подбирайте название с учётом конкретного сайта.
url_site Создаём поле в форме Тильды
- Откройте нужную форму и перейдите в её настройки.
- Добавьте новое поле типа «Поле для ввода в одну строку».
- Впишите имя переменной
url_site. - Оставьте пустыми заголовок, подзаголовок, подсказку и значение по умолчанию.
- Убедитесь, что поле не является обязательным.
url_siteИначе настоящий посетитель не сможет отправить форму: Тильда будет требовать заполнить поле, которого он не видит.
Сохраняем изменения. Если на сайте размещено несколько разных форм, такое поле нужно добавить в каждую форму, которую мы хотим проверять.
Скрываем поле при помощи CSS
Теперь нам нужно убрать поле от человеческих глаз, но сохранить его внутри формы.
Настройки сайта → Вставка кода → Пользовательские CSS-стили → Редактировать CSS.
В открывшееся поле добавляем следующий код. Замените url_site на имя переменной вашего honeypot-поля:
.t-input-group[data-field-name="url_site"] {
position: absolute !important;
left: -9999px !important;
top: auto !important;
width: 1px !important;
height: 1px !important;
overflow: hidden !important;
opacity: 0 !important;
pointer-events: none !important;
margin: 0 !important;
padding: 0 !important;
} В селекторе нужно указать точно такое же имя переменной, которое мы добавили в форму. Регистр и написание должны совпадать.
Например, если поле называется:
company_website то CSS-селектор должен выглядеть так:
.t-input-group[data-field-name="company_website"] Сохраняем код и публикуем все страницы сайта, на которых находятся формы.
Как проверить, что всё работает
После публикации откройте сайт как обычный посетитель. В форме должны остаться только настоящие поля: имя, телефон, комментарий и другие данные, которые вы действительно запрашиваете.
Поля url_site видно быть не должно.
Но на этом проверку лучше не заканчивать.
Откройте инструменты разработчика:
- Windows и Linux:
F12илиCtrl+Shift+J; - macOS:
Cmd+Option+J.
Найдите форму в HTML-коде и убедитесь, что внутри неё действительно существует элемент:
<input name="url_site">
После этого отправьте обычную тестовую заявку и проверьте:
- форма успешно отправилась;
- данные пришли в Тильду или CRM;
- поле
url_siteприсутствует в заявке; - его значение осталось пустым.
Затем можно временно отключить скрывающий CSS в инструментах разработчика, заполнить url_site тестовым значением и повторно отправить форму.
Во второй заявке поле уже должно прийти заполненным. Так мы получим два понятных примера:
url_site Обычная тестовая заявка url_site Имитация срабатывания honeypot Что можно сделать дальше
Теперь, когда мы научились создавать скрытое поле на Тильде, можно построить более сложную механику:
- не отправлять заявку в CRM, если honeypot-поле заполнено;
- показывать боту обычное сообщение об успешной отправке, но не создавать сделку;
- передавать срабатывание в Яндекс Метрику отдельной целью;
- сравнивать источники нормальных и подозрительных заявок;
- не использовать спам-цель для обучения рекламных кампаний.
Можно также создать в Метрике сегмент посетителей, достигших спам-цели и ставить корректировки −100% на эту аудиторию в Яндекс Директ. Можно анализировать источники, площадки и таргетинги по которым приходят такие заполненные скрытые поля и так же вносить корректировки в рекламу.
Чего не умеет простое скрытое поле
Важно понимать ограничения этой механики. Honeypot ловит только тех ботов, которые нашли поле и решили его заполнить.
Он не поймает:
- бота, который умеет определять скрытые элементы;
- бота, заполняющего только имя и телефон;
- программу, отправляющую данные напрямую на обработчик формы;
- человека, намеренно оставляющего фальшивые заявки;
- пользователя, который ввёл в обычные поля бессмысленный текст;
- заявку, отправленную подозрительно быстро, если honeypot остался пустым.
Например, человек или более умный бот может не трогать url_site, но написать в поле имени «ываыва», указать набор одинаковых цифр вместо телефона и отправить форму за 1–3 секунды.
Скрытое поле — это один из сигналов, а не готовая система защиты от фрода.
Дополнительно можно анализировать:
- скорость заполнения формы;
- вставку текста из буфера обмена;
- фокус полей и движения мыши;
- корректность телефона;
- частоту заявок с одного устройства;
- сочетание нескольких подозрительных признаков.
Над таким решением я работаю с марта 2026 года.
В одной из следующих статей покажу простой скрипт, который сможет запрещать отправку заявки при заполненном honeypot-поле, передавать попытку в Метрику отдельной целью и не создавать такую заявку в CRM.
Позже расскажу и о более сложной версии, которая учитывает не только скрытое поле, но и поведение людей и «нелюдей» до отправки формы и непосредственно в момент отправки.
Всем желаю всего самого наилучшего и как можно реже сталкиваться с фродом!