Детект ботов без капчи: что действительно работает
Почему проверка перестала быть защитой, какие сигналы её заменили и как выглядит честная схема невидимого детекта на практике.
Проверка перестала работать раньше, чем её перестали ставить
Капча — это тест, который предполагает, что решить его дорого для машины и дёшево для человека. Обе половины этого предположения провалились.
Для машин решение теперь дёшево. Коммерческие сервисы разгадывания принимают проверку по API и возвращают токен, цена — за тысячу, и у операторов, которым интересен ваш сайт, эта строка в бюджете уже есть. С большинством сеток картинок машинное зрение справляется вообще без участия людей.
А для людей решение перестало быть дешёвым. Сетки усложнялись как раз потому, что машины становились лучше, — так что издержки легли на ваших клиентов, а не на атакующего. На оформлении заказа эти издержки измеряются брошенными корзинами.
Итого капча стала налогом на настоящих пользователей, который настойчивый бот обходит за долю цента. В этом весь аргумент за то, чтобы искать другое.
Чем её заменяют: сигналами, а не тестами
Невидимый детект перестаёт просить посетителя что-либо доказывать и вместо этого читает то, что сессия уже сообщает. Основную часть сигнала несут три уровня.
Поведение. Как сессия взаимодействует со страницей — форма движения указателя, тайминги между событиями, то, как фокус перемещается по форме. Автоматизация даёт распределения, отличные от человеческих, и отличается сильнее всего там, где старательнее всего пытается выглядеть человеком.
Транспорт. TLS-рукопожатие и настройки HTTP/2 описывают клиентский стек. Отпечаток JA3 или JA3N говорит, какая библиотека установила соединение, а headless-браузер с настоящим TLS-стеком всё равно объявляет комбинацию, которую настоящий Chrome под Windows не даёт. Подделать это заметно труднее, чем строку User-Agent, потому что нужно повторить криптостек реального клиента, а не отредактировать заголовок.
Репутация. Что этот адрес делал раньше — на вашем сайте, и по желанию на чужих. Адрес оценивается не только по той сессии, что перед вами.
Ни один уровень не самодостаточен. Поведенческие сигналы бедны у сессии, которая зашла и сразу отправила форму; транспортные отпечатки общие у всех, кто использует одну библиотеку, включая легальных; репутация пуста при первом появлении адреса. Вердикт даёт их сочетание.
Где такой детект ошибается
Честное описание невидимого детекта включает и его ошибки, потому что они тише капчи и их легче пропустить.
- Пользователи с усиленной приватностью выглядят автоматизированными. Человек в закрытом браузере через VPN даёт бедные поведенческие сигналы и необычный отпечаток. Белый список существует ровно для этого, и его надо реально вести.
- Общие точки выхода. Корпоративные NAT, CGNAT мобильных операторов и выходы VPN ставят за один адрес тысячи не связанных между собой людей. Репутацию такого адреса нужно взвешивать иначе, иначе вы заблокируете компанию из-за того, что один человек в её сети запустил скрейпер.
- Хорошие боты, которые выглядят плохо. Повтор вебхука платёжного провайдера, ваш мониторинг аптайма, интеграция партнёра — всё это автоматизировано и всё необходимо. Их место в белом списке до включения блокировки, а не после того, как кто-то сообщит об аварии.
- Первое появление. У совсем нового адреса нет истории. Именно для этого нужен общий блеклист, и именно поэтому система, которая делает только репутацию без анализа сессии, слаба в первый день.
- Тихий дрейф. Сломавшаяся капча заметна. Детектор, который тихо начал пропускать новый паттерн бота, выглядит неотличимо от спокойной недели. Следите за долей блокировок относительно трафика, а не только за аптаймом на дашборде.
Как выглядит рабочая схема
По убыванию влияния каждого шага на результат.
Начните в режиме наблюдения. Погоняйте детект с выключенной блокировкой достаточно долго, чтобы увидеть полный недельный цикл, включая самую тихую ночь и самую активную акцию. Вы ищете вердикты, которые расходятся с тем, что вы и так знаете.
Наполните белый список до включения блокировки, а не после. Платёжные вебхуки, мониторинг, интеграции партнёров, диапазоны своих офисов, краулеры, которыми вы хотите индексироваться. Это тот шаг, который пропускают, а потом обнаруживают в три часа ночи.
Блокируйте на шлюзе, а не в странице. Решение, применённое в JavaScript, — это решение, которое атакующий может не выполнять. Блокировке место там, где отдаётся запрос.
Отказывайте в пользу пропуска на стороне платформы и в пользу запрета на своих правилах. Если сервис вердиктов недоступен, трафик должен идти: авария, которая кладёт ваш сайт, хуже прошедшего бота. Ваш список запретов — другое дело: это ваше явное указание, и оно должно пережить сбой.
Держите вердикты объяснимыми. Когда блокировку оспаривают, вам нужно видеть, какие сигналы её дали. Система, возвращающая только число, оставляет вас без ответа клиенту.
Где здесь Karma
Karma — это описанная схема в виде продукта: один асинхронный сниппет, поведенческие и транспортные сигналы в коллектор поверх TLS, вердикт по вашей собственной базе репутации и — если вы подключите — общий блеклист, собранный из того, что видели другие клиенты.
Блокировка происходит на вашем шлюзе, а решения кешируются локально, так что авария коллектора не может положить ваш сайт. Ваши списки разрешений и запретов всегда приоритетнее вердикта платформы.
Бесплатный тариф Detect и есть режим наблюдения: 25 000 вердиктов в месяц, бессрочно, без карты и без блокировки. Это ровно та схема, что описана выше, и начинать так стоит независимо от того, что вы в итоге выберете.