Обновить

Когда curl перестаёт работать: многоуровневый детект ботов и где в этой схеме живёт облачный браузер

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели10K
Всего голосов 8: ↑8 и ↓0+8
Комментарии3

Комментарии 3

ЗакрепленныеЗакреплённые комментарии

Хорошо разложено по слоям, особенно часть про L4 - её часто опускают.
Один момент, который хотелось бы дополнить: автор пишет, что stealth-плагины «латают симптомы, а не причину» - но не объясняет, почему это принципиальная проблема на архитектурном уровне.

Дело в том, что JS-патчи (тот же puppeteer-extra-plugin-stealth) работают поверх уже запущенного движка. Это значит: между стартом процесса Chromium и моментом, когда патч успевает перехватить управление, есть окно. Агрессивные антифрод-системы (DataDome, некоторые имплементации Akamai) делают fingerprint-замер именно в этом окне - до того как ваш JS вообще загружается.

Единственный способ закрыть это окно - патчить сам движок на уровне C++, до компиляции. Тогда «нечеловеческие» значения просто не попадают в runtime никогда, а не перезаписываются постфактум.

BaaS-решения закрывают эту проблему по-разному: одни через runtime-патчи (быстро, но детектируемо при правильном замере), другие через модифицированный бинарник. Снаружи выглядит одинаково, а уровень защиты принципиально разный.

Хорошо разложено по слоям, особенно часть про L4 - её часто опускают.
Один момент, который хотелось бы дополнить: автор пишет, что stealth-плагины «латают симптомы, а не причину» - но не объясняет, почему это принципиальная проблема на архитектурном уровне.

Дело в том, что JS-патчи (тот же puppeteer-extra-plugin-stealth) работают поверх уже запущенного движка. Это значит: между стартом процесса Chromium и моментом, когда патч успевает перехватить управление, есть окно. Агрессивные антифрод-системы (DataDome, некоторые имплементации Akamai) делают fingerprint-замер именно в этом окне - до того как ваш JS вообще загружается.

Единственный способ закрыть это окно - патчить сам движок на уровне C++, до компиляции. Тогда «нечеловеческие» значения просто не попадают в runtime никогда, а не перезаписываются постфактум.

BaaS-решения закрывают эту проблему по-разному: одни через runtime-патчи (быстро, но детектируемо при правильном замере), другие через модифицированный бинарник. Снаружи выглядит одинаково, а уровень защиты принципиально разный.

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

Мы разрабатываем CloakBrowser, так что как раз наша тема :)
Загляните к нам на github.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации