Анти Бот, часть 3: 10 миллионов запросов, 300 доменов и боты, которые ничего не делают

Посетитель пришел с рекламы в Директе. Открыл страницу. Сидит. Не крутит, не водит мышкой, не тыкает в экран. Через какое-то время уходит. Метрика честно записывает его в живые люди, рекламный кабинет честно списывает деньги за клик.
У нескольких наших клиентов таких "посетителей" оказалось до 30% от всего трафика с Директа. И это далеко не самое странное, что мы увидели, когда научили Анти Бот смотреть не только на то, откуда пришел посетитель, но и на то, как он себя ведет.
Это третья часть истории. В мае я рассказывал, как после проблем с Cloudflare сделал свою геоблокировку для WordPress. В августе были блокировка по ASN, общий блок-лист и модуль для 1С-Битрикс, который появился почти день в день с плагином, по просьбе тех же клиентов. И каждая статья заканчивалась обещанием: дальше оценка посетителя по поведению.
Ссылки на прошлые части: https://habr.com/ru/articles/1033428/, https://habr.com/ru/articles/1069862/, https://habr.com/ru/articles/1072726/
Обещание выполнялось почти три месяца. За это время два отдельных продукта стали одним на два движка: плагин для WordPress и модуль для Битрикса вышли в версии 2.0, считают одинаково и обновляются вместе.
Сначала цифры
около 300 доменов, на которых работает Анти Бот: WordPress и Битрикс, сайты клиентов, мультисайты, отдельные домены;
больше 10 миллионов запросов, на которых писали и проверяли детекцию;
около 70 сигналов в оценке посетителя, все считается локально, на самом сайте;
больше 160 доработок за три месяца, каждая сразу в обоих движках.
Почему капча для всех стала работать хуже
Страны и ASN отлично отсекают серверы. Но спамеры переходят на отечественных провайдеров, а сканеры продолжают использовать зарубежные локации. Заметная часть спамеров начала ходить через резидентные прокси и мобильные фермы, то есть с тех же адресов, что и ваши покупатели. Забанить Мегафон по ASN можно, но только один раз: на следующий день придет отдел продаж и спросит, куда делись заявки.
Капча всем подряд тоже не выход. Живые люди ее ненавидят. Значит, отвечать надо на другой вопрос: не "откуда ты", а "ведешь ли ты себя как человек".
Как это устроено, без кухни
Внутренности рассказывать не буду, почему, станет понятно ниже, в разделе про накрутчиков. Но принцип простой.
Представьте охранника в торговом центре. Списка запрещенных лиц у него нет, он просто замечает странное: человек в зимней куртке в июле, третий раз за минуту проходит мимо одной витрины, представился курьером, а коробки нет. Каждая странность сама по себе ничего не значит. Несколько сразу, уже повод подойти и спросить.
Анти Бот делает то же самое с каждым запросом. Около 70 независимых проверок и дополнительный набор зависимых усиливающих сигналов: как клиент представился и сходится ли это с тем, как он себя ведет; что и в каком порядке запрашивает; откуда пришел; что показала проверка браузера на странице; что о нем знают другие сайты. Каждая сработавшая добавляет баллы. Набрал немного, получи слайд-пазл. Много, блок. Ничего не набрал, ничего и не заметишь: ни капчи, ни задержки.
Пара вещей, которые пришлось понять на практике:
Вердикт и действие разные вещи. Плагин может точно знать, что перед ним не браузер, и все равно его не трогать. Честно представившийся сервис аудита сайта никому не мешает.
Сначала смотрим, потом стреляем. Есть режим наблюдения: оценка считается и пишется в журнал, но никого не останавливает. На каждом новом сайте неделю смотрим журнал и только потом включаем защиту.
Журнал не переписывается задним числом. Балл фиксируется на момент запроса, поэтому видно, как посетитель набирал его шаг за шагом и за что именно.
Сайты, которые стучат друг на друга
Мое любимое. Сайты с Анти Ботом обмениваются оценками через наш сервер, причем WordPress и Битрикс сидят в одном общем пуле.
Уходит только IP-адрес и одно число, итоговый балл посетителя. Никаких заголовков, страниц, действий, cookies, ничего, что описывает самого человека. Сырые данные о поведении сайт не покидают.
Работает это так. Бот пришел на сайт на WordPress, наследил, может даже успел дойти до формы заявки. Его балл ушел в пул, и на сайте на Битриксе, куда он придет через час, он с первого запроса получит пазл. Чем больше сайтов, тем меньше у бота шансов проскочить хоть где-то. Хотя чаще всего он отваливается уже на первом.
IP при этом не человек. Резидентный прокси сегодня у бота, завтра у обычного абонента. Поэтому оценка не вечная: живой человек с такого адреса проходит пазл и спокойно идет дальше, а балл со временем меняется. Если же с адреса продолжают шалить, его встречают одинаково на всех сайтах.
Ошибочную оценку мы снимаем сами, централизованно, клиенту ничего делать не нужно. Ответы сервера подписаны, так что подсунуть плагину чужой список не получится.
Грабли, на которые мы наступили
Кеш. Если страницу отдает полностраничный кеш, PHP вообще не запускается, и защита посетителя не видит. Сайт шустрый, а ты слепой. Пришлось сделать маячок: кешированная страница сама сообщает о просмотре, и оценка продолжает работать. Останавливает плагин только на некешируемых запросах, так что кеш не ломается.
Формы. Каждая отправка формы попадает в журнал вместе с оценкой отправителя, в том числе на самописных обработчиках, которые обходят привычные хуки. Но главный вывод был другой: ловить бота на форме уже поздно. Его надо останавливать на первом шаге, когда он только открыл сайт. Так в большинстве случаев и происходит, до формы спамный бот не доходит.
Вебхуки и интеграции. Уведомление от интернет-эквайринга приходит с сервера: без браузера, без cookies, без всего, что любит видеть антибот. По всем признакам бот. Но плагин такие запросы не ограничивает: уведомления об оплате, вебхуки и стандартные интеграции проходят как обычно. Иначе оплаченный заказ так и не станет оплаченным, и придет уже не отдел продаж, а бухгалтерия.
Поддельные поисковики. Googlebot или YandexBot в User-Agent может написать кто угодно. Настоящих проверяем по сети, из которой пришел запрос, поддельные останавливаются.
А сайт не тормозит?
Первый вопрос, который задают. Нет. Все считается в момент запроса и локально, без обращения к внешним API: базы стран и ASN лежат на самом сайте, списки обновляются в фоне по расписанию. По замерам задержка от Анти Бота теряется в обычном разбросе между двумя загрузками одной и той же страницы, в том числе в момент самой оценки.
Что видно, когда смотришь сразу на сотни сайтов
Почти половина посетителей не люди. На первых трех сайтах, где оценка работала в режиме наблюдения, за неделю от 37 до 46% уникальных посетителей набрали балл бота. Это не маркетплейсы и не форумы, а обычные сайты компаний.
Директ. Про посетителей, которые сидят и ничего не делают, я рассказал в начале. Выдает их как раз одинаковость: тот же сценарий, та же неподвижность. Живые люди так однообразно себя не ведут.
Боту все равно, какая у вас CMS. На одном сайте на Битриксе за неделю было больше тысячи запросов от сканера уязвимости Next.js с Google Cloud. Никакого Next.js там нет и не было. Сканеру это неинтересно, он стреляет по площадям.
Массовка из поиска. Однажды за два дня на один сайт пришли 846 адресов с хостингов, каждый будто бы по ссылке из поиска Google. Остановлены все. Людей в этой выборке не нашлось ни одного.
Если вы крутите поведенческие факторы, это обновление вам не подойдет
Отдельный привет накрутчикам. Накрутку ПФ мы поймали уже дважды, и это две разные компании.
Первый раз мы заранее знали, что у клиента идет накрутка, но не знали, кто ее делает, с каких сетей и как. Пока строили сигналы, вся сеть всплыла сама и начала аккуратно блокироваться. Модуль у этого клиента пришлось выключить, чтобы не мешать ему "продвигаться".
Второй раз случился буквально на днях, пока готовилась эта статья. Клиент перешел со старой блокировки по странам на новую оценку, а через некоторое время попросил вернуть все как было: не проходит то, что должно проходить. Пара уточняющих вопросов, и выяснилось, что это трафик накрутки.
Самое смешное: накрутчики тратят приличные деньги на резидентные прокси и мобильные фермы, чтобы выглядеть абонентами Мегафона и Билайна. И при этом не знают элементарных вещей о том, как выглядит настоящий браузер. Каких именно, не скажу. Вот поэтому кухню и не показываю: пусть думают.
Куда переехал спам
Раньше все было понятно: основной поток шел с серверов в Нидерландах, Германии, Франции и Азии. Сейчас картина другая:
большие облака, Amazon и Google Cloud;
американские абонентские сети вроде Verizon;
Tencent, который лезет буквально изо всех щелей, причем не только из китайских дата-центров, а с площадок по всему миру. Китая стало ооочень много.
Из российских сетей выделяются две: Cloud.ru, с которого спама заметно прибавилось, и Ростелеком. Если Мегафон и Билайн в основном идут под резидентные прокси и накрутку, то адреса Ростелекома почему-то вовсю гоняют под спамные заявки. Похоже, у многих закрылась лавочка с зарубежными серверами и VPN, и спамеры дружно переехали к отечественным провайдерам. Импортозамещение, что тут скажешь.
Журнал, нейросеть и fail2ban
В Анти Боте появился полноценный журнал: по каждому посетителю видно, какой балл он набрал, за что и что с ним в итоге сделал плагин. Смотреть его можно прямо в админке, а можно выгрузить за неделю одним файлом.
Формат выгрузки сделан так, чтобы с ним было удобно работать локальной языковой модели с агентами. Данные при этом не покидают ваш компьютер: в журнале IP-адреса и заголовки посетителей, отдавать их в облачные сервисы стоит только на свой страх и риск.
Зачем это нужно? Разбор журнала подсказывает серверные настройки. По нему видно, какие сети и какие запросы стоит резать еще раньше, на уровне nginx, iptables или fail2ban. А еще видно, сколько запросов в норме делает живой посетитель и с какого объема начинается явный перебор. Под эти цифры можно настроить rate limit, общий или отдельно для конкретных страниц. Такие ограничения встают первыми, до PHP, и мусор вообще не доходит до сайта.
Что дальше и как попробовать
Еженедельные разборы продолжаются, каждая неделя приносит пару новых правил.
Если решите попробовать, модуль, то триал на WordPress можно скачать тут: solutions.wbhr.ru/catalog/anti-bot/, 7 дней бесплатно, включается при установке без регистрации. Для Битрикса можно найти на официальном маркетплейсе, модуль "Анти Бот - защита сайта (антиспам) от нежелательного трафика, спама, ботов".
Оценка трафика на новых установках выключена, включается в настройках. Начните с режима наблюдения и посмотрите журнал за неделю, это само по себе интересное чтение.
Как и раньше, рад комментариям и критике. Особенно если у вас есть странный трафик: приносите, разберем.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.