Workspace Digital Awards — приём заявок открыт! Успейте номинироваться по самой низкой цене. Повышение цен с 1 октября.
Дмитрий Гапонов
Защита формы заявок от бота без капчи - одноразовый токен, приманка и отсечка по времени
Дмитрий Гапонов
#Программирование сайта

Защита формы заявок от бота без капчи - одноразовый токен, приманка и отсечка по времени

Дмитрий Гапонов Россия, Новосибирск
Поделиться: 0 0 0
Сфера

Промышленность и оборудование

Сдано

Сентябрь 2026

Задача

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

Форм на сайте оказалось не семь, как виделось по кускам разметки, а триста восемь штук на ста шестидесяти одной странице, плюс отдельная форма обратной связи со своим путём сохранения заявки. Срок сутки, доступа к файлам по FTP не было, только админка.

Решение

Сначала посмотрел, чем бот отличается от человека. У всех семисот девяноста семи его заявок в поле почты стоял старый домен, которого на сайте нет с середины месяца. Значит бот гоняет один и тот же слепок формы, снятый месяцы назад, и страницу не открывает вовсе. Этого хватило, чтобы выбрать главную защиту - свежий одноразовый токен в форме.

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

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

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

Журнал отказов пишет причину каждого отбитого запроса, сам обнуляется на мегабайте и наружу не отдаётся. Откат сводится к возврату одного файла из копии.

Результат

Проверял живьём, а не на словах. Ботовый запрос тем же слепком отбит, обычная заявка со страницы прошла и легла в базу. Повтор токена, заполненная приманка и отправка быстрее четырёх секунд отбиты, каждая со своей причиной в журнале. Обошёл все сто шестьдесят одну страницу - форм триста восемь, токенов в них триста восемь, расхождений ноль. То есть нет страницы, где живая заявка пропала бы молча. Рядом оставил скрипт проверки, который гоняет обе формы и печатает, что отбито и что прошло. После установки ботовых заявок не появилось ни одной.


Стек технологий

  • JavaScript JavaScript Язык программирования
  • PHP PHP Язык программирования

Оцените кейс
Спасибо за оценку
Выскажите мнение
Авторизуйтесь, чтобы добавить свой комментарий.
оставить заявку

Хотите заказать похожий проект?

Оставить заявку