BotBan

Признаки бота на сайте: как отличить программу от человека

Признаки по уровням: сначала то, что видно серверу, потом то, что заметно только изнутри браузера. И почему опираться на любой из них по отдельности опасно.

4 мин чтения

Ни один отдельный признак не доказывает, что перед вами бот. Любой из них встречается и у живых людей: у кого-то отключён JavaScript, кто-то сидит через корпоративный прокси, кто-то открыл двести вкладок разом. Уверенность даёт только совокупность.

Ниже — признаки по уровням, от тех, что видит сервер, до тех, что видны только изнутри страницы.

Уровень 1. Что видно из заголовков запроса

Библиотека вместо браузера. Самый прямой признак: клиент сам называет себя python-requests/2.31.0, curl/8.4.0, Go-http-client или Scrapy. Это не всегда злой умысел — так ходят и самописные интеграции, — но человеком тут не пахнет.

Пустой User-Agent. Так не ходит ни один браузер.

Нет заголовка Accept-Language. Браузер всегда сообщает, на каких языках предпочитает видеть страницу. Простые скрипты про это забывают.

Нет Accept-Encoding. Браузеры всегда просят сжатие: трафик дорог.

Нет заголовков Sec-Fetch у свежего Chrome. Появились в Chrome 76 и Firefox 90 и с тех пор шлются всегда. Если User-Agent заявляет Chrome 131, а Sec-Fetch-Site нет — строку переписали руками.

Несоответствие Sec-CH-UA и User-Agent. Современный Chrome сообщает свою версию дважды, разными способами. Подделывающие обычно правят только одно место.

Уровень 2. Частота и последовательность

Темп обращений. Человек читает страницу минимум секунд десять. Тридцать страниц в минуту — это уже не чтение. Сто двадцать — точно машина.

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

Последовательный обход. Человек прыгает по каталогу, возвращается, уходит в поиск. Парсер идёт страница за страницей: ?page=1, ?page=2, ?page=3.

Только HTML. Браузер, открыв страницу, тут же тянет стили, шрифты и картинки. Скрипт, которому нужны только данные, ничего этого не грузит. Если в логах видно одиночные обращения к HTML без сопровождения — это машина.

Обращения к тому, чего у вас нет. Запросы к /.env, /.git/config, /backup.sql, /wp-login.php на сайте без WordPress — сканер ищет известные дыры.

Уровень 3. Что видно изнутри браузера

Эти признаки собирает скрипт на странице, и они доступны только если бот вообще выполняет JavaScript.

navigator.webdriver. Браузер под автоматическим управлением сам сообщает об этом. Признак снимается, но снимают его не все.

Следы безоконного режима. Chrome без окна выдаёт себя: нет объекта window.chrome, нулевые размеры окна, пустой список плагинов.

Отпечаток графики. Отрисовка одной и той же картинки на canvas или в WebGL даёт чуть разный результат на разных устройствах — из-за драйверов, шрифтов и версии системы. У безоконных сборок отпечаток либо не получается вовсе, либо одинаковый у тысяч «разных» посетителей.

Ноль языков. navigator.languages у настоящего браузера никогда не пустой.

Нет взаимодействия. Человек за время на странице хоть раз двигает мышью, касается экрана или прокручивает. Полная неподвижность при заявленной минуте на странице — сильный признак.

Почему ни один признак не работает в одиночку

Возьмём отсутствие Accept-Language. Признак хороший, но встречается у некоторых мобильных браузеров в режиме экономии трафика, у части корпоративных прокси, вырезающих «лишние» заголовки, и у людей с нестандартными настройками приватности.

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

Поэтому в BotBan заложено правило: самый тяжёлый одиночный признак весит 45 из 100, а блокировка начинается с 50. Для блокировки всегда нужны минимум два независимых довода. Ошибка в одном признаке не превращается в заблокированного покупателя.

Что с этим делать

Посмотреть на свои логи. Отфильтровать обращения без Accept-Language, посчитать самые частые адреса, поискать запросы к /.env — уже это даст представление о масштабе.

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

Читайте также