Качество трафика, сайт, фрод

Как защитить формы на HTML-сайте от спам-ботов без капчи

Защитить формы на обычном HTML-сайте от спам-ботов можно без капчи и почти без программирования. Метод состоит из двух слоёв: скрипт с ловушкой и таймером на странице (Слой 1) и серверный PHP-фильтр, который принимает заявки (Слой 2). Слой 1 вставляется в код сайта за 5 минут и отсекает основную массу ботов прямо в браузере. Слой 2 устанавливается на тот же хостинг, где размещён сайт, и добивает ботов, которые шлют заявки напрямую, минуя страницу. На сайте моего клиента эта связка свела спам с 3000 заявок в месяц к нулю.

По отчёту Imperva Bad Bot Report за 2025 год на автоматический трафик пришлось 51% всех визитов в интернете, и почти 37% это вредоносные боты. Обычному HTML-сайту от них достаётся больше всех: у конструкторов есть хоть какая-то встроенная защита форм, а у сайта, который собрал фрилансер или студия, между формой и вашей почтой чаще всего нет вообще ничего. Ниже разберём, как закрыть формы от ботов двумя готовыми файлами и не потерять живые заявки. Весь код можно скачать комплектом ниже.

Почему в формы обычного сайта сыплется спам

У самописного HTML-сайта нет встроенного антиспама: форма пересылает на почту или в свой скрипт-обработчик всё, что в неё пришло. Обязательные поля и маска телефона от ботов не спасают, это проверки для людей, они встроены в браузер посетителя.

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

Поэтому один приём не закрывает проблему: браузерная защита не видит прямых запросов, а серверная в одиночку хуже отличает ботов, идущих через страницу. Нужна связка из двух слоёв, каждый из которых ловит свой тип.

Если вы размещаете рекламу, спам опаснее вдвойне: фейковые заявки съедают время на обработку, но главное, они портят обучение автостратегий Яндекс Директа: алгоритм засчитывает мусорные отправки за конверсии и ведёт кампанию не на тех людей.

Забрать готовый комплект

Весь метод собран в готовый комплект: программировать ничего не нужно, код вставляется как есть. Комплект из трёх файлов для HTML-сайта:

  • antispam-html.txt, скрипт первого слоя (ловушка и таймер). Сам находит все формы на странице и защищает их, размечать ничего не нужно.
  • webhook-handler.php, серверный фильтр второго слоя.
  • README.txt, пошаговая инструкция по установке обоих слоёв.

Этот комплект и ещё два инструмента я бесплатно отдаю подписчикам канала: нажмите кнопку, подпишитесь и заберите весь набор. Это тот же метод, что свёл спам к нулю на сайте клиента.

Забрать в Telegram Забрать в MAX

Сайт не самописный, а на конструкторе или CMS? Для них есть отдельные комплекты и разборы: защита форм на Тильде и защита форм на WordPress, там свои особенности и у скрипта, и у серверного слоя.

Слой 1: ловушка и таймер на странице

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

Ловушка (honeypot) — это скрытое поле формы. Живой человек его не видит и не трогает, а бот, который автоматически заполняет все поля подряд, впишет в него что-нибудь. Пришло поле-ловушка непустым, значит заявку слал бот. Причём спрятано поле не простым способом вроде display:none, который часть ботов умеет распознавать и обходить, а сдвинуто за край экрана. Таймер считает время с первого касания полей, а не с загрузки страницы: человек, который открыл сайт и долго думал, не заблокируется по ошибке, а бот, мгновенно набивший форму, отсечётся.

Поставить слой 1 можно за 5 минут:

  1. Откройте файл antispam-html.txt из комплекта и скопируйте весь его текст. Тег script уже внутри, дописывать ничего не нужно.
  2. Вставьте скопированное в код страницы перед закрывающим тегом </body>, это самый конец HTML-файла. Если сайт собран из нескольких страниц с общим футером (нижней частью, которая подключается везде), вставьте код туда, тогда защита встанет на все страницы сразу. Общего футера нет, вставьте на каждую страницу с формой.
  3. Сохраните файл и загрузите на хостинг тем же способом, каким обычно обновляете сайт. Если сайт обновляет разработчик или фрилансер, просто перешлите ему архив: в README сказано, что куда вставить.

Проверка простая: откройте свой сайт, начните заполнять форму и нажмите «Отправить» быстрее трёх секунд. Заявка не уйдёт, сработал таймер. Заполните спокойно, отправится нормально.

Если на странице есть форма, которую защищать не нужно, например поиск по сайту, добавьте ей в HTML атрибут data-antispam-skip, скрипт её не тронет.

Для рекламы у слоя 1 есть отдельная выгода. Отправка бота отменяется прямо в браузере, поэтому цель «форма отправлена» в Метрике не срабатывает, и бот не засчитывается конверсией. Яндекс Директ не учится на спаме и не уводит бюджет на трафик, который приводит ботов. Работает это при условии, что конверсией считается успешная отправка формы, а не клик по кнопке.

У слоя 1 есть два ограничения. Первое: скрипт перехватывает обычную отправку формы, событие submit. Так работают формы, которые после отправки перезагружают страницу или уходят на свой обработчик, то есть большинство обычных сайтов. Но если разработчик отправляет форму скриптом в обход этого события, защита такую отправку не увидит, уточните у него, как устроена отправка. Второе: ботов, которые бьют запросами напрямую, минуя страницу, слой 1 не видит в принципе. Для них следующий слой.

Слой 2: серверный фильтр заявок

Слой 2 — это PHP-файл, который принимает заявки вашей формы, проверяет их на сервере и пересылает реальные вам в Telegram или на почту, а спам отбрасывает. В отличие от конструкторов, где под серверный фильтр приходится заводить отдельный хостинг, у обычного сайта хостинг уже есть: файл загружается в ту же папку на хостинге, где лежат файлы сайта.

Требования скромные: на хостинге должен работать PHP версии 7.0 или новее и сайт должен открываться по HTTPS. На практике это любой обычный российский хостинг: Beget, Timeweb, reg.ru и подобные. Для доставки заявок в Telegram дополнительно нужен модуль cURL, он почти везде включён по умолчанию.

Настройка занимает 30-60 минут:

  1. Заполните настройки. Откройте файл webhook-handler.php в любом текстовом редакторе. В самом верху есть блок НАСТРОЙКИ с подсказками. Впишите домен своего сайта (сам домен и вариант с www, без https:// и слэшей) и куда присылать заявки. Для почты это ваш обычный рабочий ящик. Для Telegram нужен токен бота: напишите в Telegram боту @BotFather команду /newbot, придумайте имя, и он пришлёт строку-токен, её вставьте в файл. В блоке настроек домен пока указан примером (example.ru): замените его на свой, и фильтр включит проверку источника.
  2. Загрузите файл на хостинг. Зайдите в личный кабинет хостинга, откройте раздел «Файловый менеджер» (это как папки на компьютере, только в интернете), найдите корневую папку сайта, обычно она называется public_html, и загрузите туда webhook-handler.php кнопкой «Загрузить». Файл должен появиться в списке рядом с файлами сайта.
  3. Направьте форму на фильтр. В HTML-коде формы, в теге <form>, укажите атрибуты action="/webhook-handler.php" и method="POST". Атрибут action — это адрес, куда браузер отправляет заполненную форму, теперь им станет ваш фильтр. Если форма и так отправлялась в какой-то скрипт, action просто меняется со старого адреса на новый. Если форма отправляется через JavaScript, тот же адрес указывается в коде отправки. А если у сайта уже есть свой обработчик и менять его не хочется, разработчик может перенести проверки из webhook-handler.php внутрь существующего кода, файл открытый и подробно откомментирован.
Блок настроек в файле webhook-handler.php: домен сайта, поля ловушки и таймера, каналы доставки в Telegram и на почту
Блок НАСТРОЙКИ в начале webhook-handler.php: сюда вписать домен и канал доставки

Что именно проверяет фильтр. Во-первых, источник: настоящая заявка приходит со страницы вашего домена, и сервер это видит. Заявка с чужого адреса отбрасывается. Во-вторых, прямые запросы: если у заявки нет ни признаков вашей страницы, ни поля таймера от слоя 1, значит кто-то бьёт по адресу фильтра напрямую, и она отбрасывается. В-третьих, ловушку и таймер, те же проверки, что в браузере, но на сервере их уже не обойти. И в-четвёртых, пустые заявки без единого содержательного поля. Всё, что прошло проверки, пересылается вам и дублируется в защищённый файл на хостинге, это страховка на случай, если письмо или сообщение не дойдёт.

После отправки формы напрямую через action посетитель увидит короткий технический ответ «ok» вместо привычной страницы «спасибо». Защите это не мешает, но если хочется красивую страницу благодарности, попросите разработчика добавить в конец скрипта перенаправление на неё, это правка в одну строку.

Проверьте связку: отправьте с сайта тестовую заявку, она должна прийти в Telegram или на почту. Не пришла, сверьте по порядку: верно ли вписан домен (без https:// и слэшей), верны ли токен бота и chat_id или почтовые адреса, включён ли cURL.

Насколько снижается спам после двух слоёв

Мой случай такой: обычный HTML-сайт клиента на своём хостинге. До защиты приходило около 3000 спам-заявок в месяц, примерно 97 в день. Ловушка с проверкой источника срезала поток на 98%, а после добавления таймера спам пропал совсем. Боты по-прежнему стучатся, около 38 попыток в день, но до клиента не доходит ни одна, а живые заявки идут без препятствий.

Чтобы было понятно, какой слой за что отвечает, вся защита одной таблицей.

СлойГде работаетЧто отсекаетЧто нужно для установки
Слой 1: ловушка и таймерВ браузере посетителяМассовых ботов, заполняющих форму через страницуВставить скрипт в код сайта
Слой 2: PHP-фильтрНа вашем хостингеПрямые запросы мимо страницы, заявки без единого заполненного поляХостинг с PHP, он у сайта уже есть
Капча (по желанию)На странице и на сервереРедких ботов, написанных под конкретный сайтПодключение виджета и серверная проверка

У метода есть ограничение: связка рассчитана на массовый нецелевой спам, а это почти весь спам в интернете. Бот, написанный вручную под конкретно ваш сайт, обойдёт любую защиту без капчи, но такое бывает редко. На этот случай и остаётся капча.

Нужна ли капча и почему её ставят последней

Капча нужна, только если после двух слоёв спам всё равно идёт, а это редкий случай. Капча всегда снижает конверсию: по опросу Fastly 2025 года 23% покупателей бросают оформление, когда видят капчу, а по данным Baymard примерно 8% ошибаются при вводе. Поэтому капча — это крайняя мера, а не первый шаг.

Google reCAPTCHA в России не стоит ставить по двум причинам. Юридическая: с 1 июля 2025 поправки в 152-ФЗ ограничивают передачу персональных данных россиян за рубеж, а reCAPTCHA работает на серверах Google за пределами страны, и за нарушение предусмотрены штрафы в несколько миллионов рублей. Техническая: при перебоях с доступом к домену google.com форма с reCAPTCHA просто перестаёт отправляться, и вы теряете все заявки.

Если капча действительно понадобилась, используйте Яндекс SmartCaptcha: её серверы в России, и есть невидимый режим, когда проверку проходят только подозрительные запросы. На обычном HTML-сайте она встраивается проще, чем на конструкторах: виджет добавляется в форму на странице, а проверка, что капча пройдена, делается на сервере, и её удобно встроить в тот же webhook-handler.php. Серверная проверка обязательна: виджет без неё бот обходит.

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

Частые вопросы

Как защитить форму на HTML-сайте от спам-ботов без капчи?

Ставят два слоя защиты. Слой 1 — это скрипт с ловушкой honeypot и таймером заполнения: он вставляется в код страницы и блокирует ботов прямо в браузере. Слой 2 — это серверный PHP-фильтр: он принимает заявки формы и отбрасывает те, что пришли не со страниц вашего сайта. Капча при этом не нужна.

Почему обязательные поля и проверка телефона не останавливают ботов?

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

Что такое honeypot-ловушка и как она ловит ботов?

Honeypot — это скрытое поле формы. Живой человек его не видит и оставляет пустым, а бот заполняет автоматически вместе с остальными полями. Если поле-ловушка пришло непустым, заявку отправил бот, и отправка блокируется. Скрытые поля добавляет готовый скрипт, размечать формы вручную не нужно.

Нужно ли уметь программировать, чтобы поставить эту защиту?

Нет. Слой 1 — это готовый скрипт, его вставляют в код страницы перед закрывающим тегом body как есть. В слое 2 заполняют блок настроек в начале PHP-файла по подсказкам: домен сайта и куда слать заявки. Если сайт обслуживает разработчик, передайте ему комплект вместе с инструкцией из архива.

Помогает ли метод против обучения Яндекс Директа на спам-заявках?

Да. Слой 1 отменяет отправку бота прямо в браузере, поэтому цель «форма отправлена» в Метрике не срабатывает и спам не засчитывается конверсией. Яндекс Директ не учится на мусорных заявках. Работает при условии, что конверсией считается успешная отправка формы, а не клик по кнопке.

Чем защита форм на HTML-сайте отличается от защиты на Тильде?

Принцип одинаковый: ловушка с таймером на странице плюс серверный фильтр. Разница в подключении. На HTML-сайте скрипт вставляется перед закрывающим тегом body, а фильтр кладётся на тот же хостинг и указывается адресом отправки формы. На Тильде скрипт ставится через вставку кода, а фильтр подключается через webhook.

Можно ли ставить Google reCAPTCHA на сайт в России?

Не стоит. С 1 июля 2025 поправки в 152-ФЗ ограничивают передачу персональных данных россиян за рубеж, а reCAPTCHA работает на серверах Google за пределами страны. К тому же при перебоях с доступом к google.com форма перестаёт отправляться. Российская альтернатива — это Яндекс SmartCaptcha.

Сыпется спам в формы или мусорные заявки портят рекламу? Запишитесь на бесплатную консультацию: посмотрю ваш случай и подскажу решение.

Бесплатная консультация