Руководство

Детект ботов без капчи: что действительно работает

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

Проверка перестала работать раньше, чем её перестали ставить

Капча — это тест, который предполагает, что решить его дорого для машины и дёшево для человека. Обе половины этого предположения провалились.

Для машин решение теперь дёшево. Коммерческие сервисы разгадывания принимают проверку по API и возвращают токен, цена — за тысячу, и у операторов, которым интересен ваш сайт, эта строка в бюджете уже есть. С большинством сеток картинок машинное зрение справляется вообще без участия людей.

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

Итого капча стала налогом на настоящих пользователей, который настойчивый бот обходит за долю цента. В этом весь аргумент за то, чтобы искать другое.

Чем её заменяют: сигналами, а не тестами

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

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

Транспорт. TLS-рукопожатие и настройки HTTP/2 описывают клиентский стек. Отпечаток JA3 или JA3N говорит, какая библиотека установила соединение, а headless-браузер с настоящим TLS-стеком всё равно объявляет комбинацию, которую настоящий Chrome под Windows не даёт. Подделать это заметно труднее, чем строку User-Agent, потому что нужно повторить криптостек реального клиента, а не отредактировать заголовок.

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

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

Где такой детект ошибается

Честное описание невидимого детекта включает и его ошибки, потому что они тише капчи и их легче пропустить.

  • Пользователи с усиленной приватностью выглядят автоматизированными. Человек в закрытом браузере через VPN даёт бедные поведенческие сигналы и необычный отпечаток. Белый список существует ровно для этого, и его надо реально вести.
  • Общие точки выхода. Корпоративные NAT, CGNAT мобильных операторов и выходы VPN ставят за один адрес тысячи не связанных между собой людей. Репутацию такого адреса нужно взвешивать иначе, иначе вы заблокируете компанию из-за того, что один человек в её сети запустил скрейпер.
  • Хорошие боты, которые выглядят плохо. Повтор вебхука платёжного провайдера, ваш мониторинг аптайма, интеграция партнёра — всё это автоматизировано и всё необходимо. Их место в белом списке до включения блокировки, а не после того, как кто-то сообщит об аварии.
  • Первое появление. У совсем нового адреса нет истории. Именно для этого нужен общий блеклист, и именно поэтому система, которая делает только репутацию без анализа сессии, слаба в первый день.
  • Тихий дрейф. Сломавшаяся капча заметна. Детектор, который тихо начал пропускать новый паттерн бота, выглядит неотличимо от спокойной недели. Следите за долей блокировок относительно трафика, а не только за аптаймом на дашборде.

Как выглядит рабочая схема

По убыванию влияния каждого шага на результат.

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

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

Блокируйте на шлюзе, а не в странице. Решение, применённое в JavaScript, — это решение, которое атакующий может не выполнять. Блокировке место там, где отдаётся запрос.

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

Держите вердикты объяснимыми. Когда блокировку оспаривают, вам нужно видеть, какие сигналы её дали. Система, возвращающая только число, оставляет вас без ответа клиенту.

Где здесь Karma

Karma — это описанная схема в виде продукта: один асинхронный сниппет, поведенческие и транспортные сигналы в коллектор поверх TLS, вердикт по вашей собственной базе репутации и — если вы подключите — общий блеклист, собранный из того, что видели другие клиенты.

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

Бесплатный тариф Detect и есть режим наблюдения: 25 000 вердиктов в месяц, бессрочно, без карты и без блокировки. Это ровно та схема, что описана выше, и начинать так стоит независимо от того, что вы в итоге выберете.

FAQ

Можно ли детектировать ботов без капчи?
Да, и сейчас это основной подход. Невидимый детект читает поведенческие сигналы сессии, транспортные отпечатки из TLS-рукопожатия и настроек HTTP/2, а также репутацию адреса, и выносит вердикт, ничего не спрашивая у посетителя. Не показывается ничего, поэтому нет и шага воронки, на котором теряются настоящие клиенты.
Капча всё ещё эффективна против ботов?
Куда меньше, чем можно подумать по её распространённости. Коммерческие сервисы разгадывания возвращают токен по API за долю цента, а машинное зрение справляется с большинством сеток картинок само. Проверка стала издержкой, которую платят в основном настоящие пользователи, тогда как значимые атакующие относятся к ней как к небольшой строке расходов.
Что такое TLS-фингерпринтинг и чем он помогает?
TLS-рукопожатие раскрывает упорядоченный набор шифронаборов, расширений и кривых, который различается у разных клиентских библиотек, — он сворачивается в хеш JA3 или JA3N. Отпечаток говорит, какой стек установил соединение, поэтому скрипт, называющий себя Chrome, но использующий TLS-библиотеку Python, виден. Подделать это гораздо труднее, чем User-Agent: нужно повторить криптостек реального клиента, а не отредактировать заголовок.
Чем рискует невидимый детект ботов?
В основном ложными срабатываниями на настоящих пользователях, которые выглядят автоматизированными — закрытые браузеры, выходы VPN и CGNAT, — и на хороших ботах вроде платёжных вебхуков и мониторинга. И то и другое лечится белым списком, наполненным до включения блокировки, и периодом наблюдения, покрывающим полный недельный цикл трафика.