Kasada Anti-Bot в 2026 году остаётся одной из самых сложных систем обнаружения автоматизации на рынке. Если вы — инженер скрапинга, специалист по безопасности или разработчик легитимной автоматизации, вам важно понимать, как именно Kasada идентифицирует ботов и какие технические шаги позволяют пройти её проверку корректно, без подделки сигнатур. В этом разборе мы детально рассмотрим архитектуру ips.js, TLS-фингерпринтинг JA3/JA4, роль заголовков x-kpsdk-ct и почему резидентные прокси — необходимое условие для любого легитимного kasada bypass.
Архитектура Kasada Anti-Bot 2026: многоуровневая защита
Kasada не полагается на один механизм. Платформа использует каскад из четырёх уровней проверки, каждый из которых фильтрует ботов до того, как они доберутся до целевого контента:
- IP-репутация и ASN-скрининг — выполняется до любого JavaScript.
- TLS/HTTP2-фингерпринтинг — JA3/JA4 хеши проверяются на соответствие известным браузерам.
- JavaScript-челлендж ips.js — кастомная байткод-VM собирает фингерпринт устройства.
- Постоянная валидация — заголовки x-kpsdk-ct и cookie KP_UIDz проверяются при каждом запросе.
Каждый уровень может отклонить запрос независимо. Это означает, что даже идеальное выполнение ips.js не поможет, если ваш IP принадлежит дата-центру или TLS-фингерпринт не совпадает с заявленным User-Agent.
ips.js: байткод-виртуальная машина Kasada
Скрипт ips.js — ядро системы Kasada. Это не обычный JavaScript-файл, а ~449KB кастомной байткод-виртуальной машины с собственным набором инструкций, зашифрованной таблицей строк и механизмами анти-отладки. По данным исследователей из BleepingComputer и анализов сообщества GitHub, архитектура ips.js включает:
- Кастомный байткод — вместо читаемого JavaScript, VM исполняет собственный набор опкодов, что делает статический анализ практически невозможным без реверс-инжиниринга VM.
- Зашифрованная таблица строк — все строковые литералы (имена API, свойства, константы) хранятся в закодированном виде и расшифровываются во время выполнения с использованием time-based seeds.
- Time-based seeds — начальное состояние VM частично зависит от текущего времени, что делает повторное воспроизведение челленджа нетривиальной задачей.
- Integrity checksums — VM проверяет собственную целостность и целостность окружения, обнаруживая патчи и модификации.
При загрузке страницы ips.js выполняется в браузере, собирает десятки сигналов о среде выполнения и генерирует зашифрованный payload. Результат — cookie KP_UIDz, который служит доказательством прохождения челленджа.
Заголовки x-kpsdk-ct, x-kpsdk-cd, x-kpsdk-dv
После прохождения ips.js-челленджа каждый последующий запрос к защищённому сайту должен содержать семейство заголовков:
| Заголовок | Назначение | Поведение |
|---|---|---|
| x-kpsdk-ct | Challenge token — основной токен челленджа | Вращается при каждом запросе; при failure сервер возвращает 429 с этим заголовком |
| x-kpsdk-cdChallenge data — дополнительные данные сессии | Содержит зашифрованные метаданные о среде выполнения | |
| x-kpsdk-dvDevice verification — верификация устройства | Включает хеш фингерпринта устройства, сгенерированный ips.js |
Когда сервер возвращает HTTP 429 с заголовком x-kpsdk-ct, это означает, что токен челленджа оказался недействительным. Причины могут быть разными: истёк срок действия KP_UIDz, IP-репутация упала ниже порога, или ips.js не выполнился в реальном браузерном окружении. Каждая такая неудача дополнительно снижает доверие к IP-адресу.
Ключевой вывод: HTTP 429 с x-kpsdk-ct — это не просто rate limit. Это сигнал, что Kasada отклонила ваш токен челленджа. Повторные запросы без перезапуска челленджа только усугубляют ситуацию.
TLS-фингерпринтинг: JA3 и JA4 в контексте Kasada
До того, как ips.js начнёт выполнение, Kasada уже оценивает ваш запрос на сетевом уровне. TLS-фингерпринтинг — первая линия обороны, и она исключительно эффективна против HTTP-клиентов, маскирующихся под браузеры.
JA3: классический TLS-фингерпринт
JA3 создаёт хеш из ClientHello-пакета, включая:
- Версию TLS (например, TLS 1.3 = 0x0304)
- Набор шифров в порядке предпочтения (например,
TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256) - Список расширений и их порядок
- Типы эллиптических кривых
- Форматы сжатия точек
Каждый браузер и каждая библиотека имеет уникальный, воспроизводимый JA3-хеш. Chrome на Windows, Firefox на Linux, Python requests с urllib3 — все они формируют разные сигнатуры. Kasada поддерживает базу известных валидных JA3-хешей для актуальных версий браузеров.
JA4: улучшенный формат 2024-2026
JA4, представленный в FoxIO-репозитории, расширяет JA3, добавляя:
- Сегментацию по типу приложения (браузер, библиотека, платформа)
- Учёт ALPN-протоколов (h2, http/1.1)
- Более гранулярное разделение расширений SNI и supported_versions
Kasada использует JA4 для более точной классификации клиентов. Например, JA4 позволяет отличить Chrome 131 от Chrome 128, даже если JA3-хеши совпадают. Это критично: если ваш User-Agent заявляет Chrome 131, но JA4-хеш соответствует Chrome 128, Kasada немедленно помечает запрос как подозрительный.
HTTP/2 fingerprinting
Поверх TLS, Kasada проверяет HTTP/2-настройки клиента:
- SETTINGS frame — порядок и значения параметров (HEADER_TABLE_SIZE, ENABLE_PUSH, MAX_CONCURRENT_STREAMS)
- WINDOW_UPDATE — начальный размер окна
- PRIORITY frames — приоритеты потоков, которые уникальны для каждого браузера
- Pseudo-header order — порядок
:method,:authority,:scheme,:path
Python httpx, Node.js got и Go net/http имеют HTTP/2-сигнатуры, радикально отличающиеся от Chrome или Firefox. Kasada обнаруживает это несоответствие ещё до выполнения ips.js.
IP-репутация: почему дата-центр прокси не работают
Kasada применяет один из самых агрессивных IP-фильтров на рынке. Архитектура IP-скрининга включает:
- ASN-классификацию — дата-центр ASN (AWS, Google Cloud, Azure, DigitalOcean, OVH, Hetzner) помечаются как низкодоверенные. По данным PeeringDB, более 60% всех дата-центр IP-диапазонов находятся в чёрных списках Kasada.
- Историю IP — если IP ранее использовался для скрапинга, атак или спама, репутация снижается.
- Географическую согласованность — если IP заявляет одну страну, но Timezone и язык браузера указывают на другую, это сигнал.
- Поведенческий скоринг — частота запросов с IP, шаблоны навигации, время между запросами.
Практический результат: запрос через дата-центр прокси получает 429 или 403 ещё до выполнения ips.js. Это делает резидентные прокси не опцией, а необходимостью для любого kasada bypass.
| Тип прокси | Проход IP-скрининга Kasada | Подходность для ips.js |
|---|---|---|
| Дата-центр (AWS, GCP, Azure) | ~5-10% success rate | Низкая — IP блокируется до JS |
| Резидентные (ISP) | ~85-95% success rate | Высокая — реальный ISP-IP |
| Мобильные (4G/5G) | ~90-98% success rate | Наивысшая — мобильные сети доверяются больше всего |
Легитимный подход: ProxyHat + реальный браузер
Для авторизованного тестирования или сбора публичных данных с сайтов под защитой Kasada, вам нужно объединить три компонента:
- Резидентные прокси с реальными ISP-IP (ProxyHat).
- Реальный браузерный рантайм (Playwright, Puppeteer) для выполнения ips.js.
- Корректное управление сессиями — сохранение KP_UIDz и заголовков x-kpsdk-ct.
Шаг 1: Настройка ProxyHat через SOCKS5
Для Kasada-защищённых сайтов рекомендуется SOCKS5, поскольку он обеспечивает прозрачный туннель без модификации заголовков:
# SOCKS5 через ProxyHat с гео-таргетингом на США
socks5://user-country-US-session-kasada01:pass@gate.proxyhat.com:1080
# HTTP-альтернатива
http://user-country-US-session-kasada01:pass@gate.proxyhat.com:8080
Параметр session-kasada01 создаёт sticky-сессию — IP остаётся неизменным на протяжении всей сессии. Это критично для Kasada: KP_UIDz привязан к IP, и смена IP между запросами аннулирует токен.
Шаг 2: Playwright с ProxyHat
from playwright.sync_api import sync_playwright
proxy_config = {
"server": "socks5://gate.proxyhat.com:1080",
"username": "user-country-US-session-kasada01",
"password": "pass"
}
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False, # Kasada обнаруживает headless
proxy=proxy_config,
args=[
"--disable-blink-features=AutomationControlled",
"--no-sandbox"
]
)
context = browser.new_context(
viewport={"width": 1920, "height": 1080},
locale="en-US",
timezone_id="America/New_York",
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/131.0.0.0 Safari/537.36"
)
page = context.new_page()
# Первый запрос — ips.js выполнится автоматически
page.goto("https://protected-site.com")
# Ждём завершения челленджа (KP_UIDz cookie)
page.wait_for_timeout(5000)
# Извлекаем cookies для последующих API-запросов
cookies = context.cookies()
kp_uidz = next(
(c["value"] for c in cookies if c["name"] == "KP_UIDz"),
None
)
if kp_uidz:
print(f"KP_UIDz получен: {kp_uidz[:20]}...")
else:
print("Челлендж не пройден — проверьте IP и браузер")
browser.close()
Шаг 3: Извлечение заголовков x-kpsdk-ct
После прохождения челленджа, ips.js генерирует заголовки через перехват fetch/XHR. Для API-запросов к тому же домену, браузер автоматически добавит x-kpsdk-ct, x-kpsdk-cd и x-kpsdk-dv. Если вы используете page.request в Playwright, заголовки будут включены автоматически:
# Используем контекст браузера для API-запросов
# Playwright автоматически добавит x-kpsdk-* заголовки
response = page.request.get(
"https://protected-site.com/api/data",
headers={
"Accept": "application/json",
"Referer": "https://protected-site.com/"
}
)
print(f"Status: {response.status}")
print(f"Data: {response.json()}")
Шаг 4: curl с предварительно полученными токенами
Для лёгких API-запросов после получения KP_UIDz и заголовков через браузер, можно использовать curl:
curl -x socks5://user-country-US-session-kasada01:pass@gate.proxyhat.com:1080 \
-H "Cookie: KP_UIDz=YOUR_KP_UIDZ_VALUE" \
-H "x-kpsdk-ct: YOUR_CT_VALUE" \
-H "x-kpsdk-cd: YOUR_CD_VALUE" \
-H "x-kpsdk-dv: YOUR_DV_VALUE" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
https://protected-site.com/api/data
Однако помните: curl не имеет JA3/JA4-фингерпринта Chrome. Если Kasada проверяет TLS-сигнатуру на API-эндпоинтах (что бывает не всегда), curl-запрос будет отклонён. В этом случае оставайтесь в браузерном контексте.
Что собирает ips.js: фингерпринт браузера и устройства
ips.js VM собирает обширный набор сигналов. Вот основные категории, основанные на анализе защищённых скриптов:
Сигналы браузера
- navigator.webdriver —
trueв неуправляемых браузерах = мгновенный блок. - navigator.plugins — список плагинов должен соответствовать реальному Chrome/Firefox.
- navigator.languages — массив языков; пустой массив или несоответствие Accept-Language = подозрительно.
- window.chrome — объект должен существовать в Chrome и иметь правильную структуру.
- Notification.permission — должно быть
default, а неgrantedилиdeniedв свежем профиле.
Canvas и WebGL-фингерпринтинг
ips.js рендерит скрытый canvas и считывает пиксельные данные. Хеш canvas-изображения зависит от GPU, драйвера и ОС. Headless-браузеры без GPU дают предсказуемый, детектируемый хеш. WebGL-параметры (UNMASKED_VENDOR_WEBGL, UNMASKED_RENDERER_WEBGL) проверяются на соответствие заявленной ОС.
Поведенческие сигналы
- Время между загрузкой страницы и первым взаимодействием — боты часто слишком быстры.
- Mouse movement entropy — ips.js может собирать события мыши и анализировать их естественность.
- Touch events — на мобильных, отсутствие touch-событий при заявленном мобильном UA = блок.
- Timing of ips.js execution — если челлендж решается за 50ms, это нереалистично для реального браузера.
Почему подделка этих сигналов не работает
ips.js использует time-based seeds и integrity checksums. Это означает, что:
- Вы не можете просто скопировать payload из одного сеанса в другой — seed меняется.
- Вы не можете патчить VM — integrity check обнаружит модификацию.
- Вы не можете заранее вычислить токен — часть данных зависит от серверных параметров, передаваемых в момент челленджа.
Единственный надёжный подход — выполнить ips.js в реальном браузере с реальным IP. Любой kasada bypass, основанный на подделке сигналов, нестабилен и ломается при каждом обновлении VM.
Типичные ошибки и edge cases
1. Headless-режим без stealth-патчей
Стандартный p.chromium.launch(headless=True) обнаруживается мгновенно. navigator.webdriver = true, отсутствие window.chrome, canvas без GPU — всё это сигналы для Kasada. Решение: используйте headless=False с виртуальным дисплеем (Xvfb) или специализированные stealth-браузеры.
2. Несоответствие User-Agent и TLS-фингерпринта
Если User-Agent заявляет Chrome 131 на Windows, но JA4-хеш соответствует Chrome 128 на macOS, Kasada отклонит запрос. Всегда используйте браузер, чья версия совпадает с User-Agent, и не подменяйте UA через заголовки.
3. Ротация IP без перезапуска сессии
KP_UIDz привязан к IP-адресу. Если вы меняете IP через ротацию прокси без перезапуска браузерного контекста, токен становится недействительным. Используйте sticky-сессии ProxyHat (user-session-xxx) для поддержания одного IP на протяжении всей сессии.
4. Слишком быстрые запросы
Даже с валидным KP_UIDz, частота запросов мониторится. Рекомендуемый интервал — 2-5 секунд между запросами для скрапинга. Kasada использует поведенческую аналитику: запросы с интервалом 100ms помечаются как бот-шаблон.
5. Игнорирование 429 с x-kpsdk-ct
Получив 429 с заголовком x-kpsdk-ct, многие продолжают отправлять запросы. Это усугубляет ситуацию: каждый неудачный запрос снижает IP-репутацию. Правильное действие — остановка, перезапуск браузерного контекста с новой сессией ProxyHat, и повторное прохождение челленджа.
Настройка ProxyHat для Kasada-защищённых сайтов
ProxyHat предоставляет резидентные и мобильные прокси, которые подходят для работы с Kasada. Ключевые рекомендации по настройке:
Выбор типа прокси
Для Kasada используйте резидентные прокси как базовый вариант. Если сайт особенно агрессивно фильтрует, мобильные прокси обеспечивают максимальное доверие, поскольку мобильные ASN (Verizon, T-Mobile, AT&T) имеют наивысший reputation score.
Гео-таргетинг
Kasada проверяет географическую консистентность. Если ваш IP в Германии, а Timezone браузера — America/New_York, это сигнал. Согласуйте гео прокси с настройками браузера:
# США — IP и браузер должны совпадать
socks5://user-country-US-session-kasada01:pass@gate.proxyhat.com:1080
# Браузер: locale="en-US", timezone_id="America/New_York"
# Германия
socks5://user-country-DE-session-kasada02:pass@gate.proxyhat.com:1080
# Браузер: locale="de-DE", timezone_id="Europe/Berlin"
Доступные локации ProxyHat можно найти на странице локаций.
Управление сессиями
Для Kasada критична стабильность IP в рамках сессии. ProxyHat поддерживает sticky-сессии через параметр session в username:
# Sticky-сессия — IP не меняется
user-session-mySession123:pass@gate.proxyhat.com:8080
# Новая сессия = новый IP
user-session-newSession456:pass@gate.proxyhat.com:8080
Когда KP_UIDz истёк или вы получили 429, создайте новую сессию с новым идентификатором для получения свежего IP. Подробнее о тарифах и объёмах — на странице цен ProxyHat.
Конкурентность
Для параллельного скрапинга нескольких страниц под Kasada, используйте разные сессии (разные IP) для каждого браузерного контекста:
# Контекст 1
socks5://user-country-US-session-worker01:pass@gate.proxyhat.com:1080
# Контекст 2
socks5://user-country-US-session-worker02:pass@gate.proxyhat.com:1080
# Контекст 3
socks5://user-country-US-session-worker03:pass@gate.proxyhat.com:1080
Рекомендуем не более 3-5 параллельных сессий на один целевой домен, чтобы избежать паттерн-обнаружения.
Юридические и этические аспекты
Технический kasada bypass должен применяться только в легитимных целях:
- Авторизованное тестирование — пентестинг собственных систем или систем с письменного разрешения владельца.
- Сбор публичных данных — данные, доступные без авторизации и не защищённые авторским правом или ToS.
- Исследование безопасности — анализ механизмов защиты в академических целях.
Недопустимые применения включают: мошенничество, создание фейковых аккаунтов, обход платных подписок, DDoS через обход rate limits, кража контента, защищённого авторским правом.
В США Computer Fraud and Abuse Act (CFAA) делает несанкционированный доступ к компьютерным системам уголовным преступлением. Обход технических защит, даже при доступе к «публичным» данным, может квалифицироваться как нарушение CFAA, если это противоречит ToS сайта. В ЕС GDPR регулирует сбор и обработку персональных данных — сбор данных, идентифицирующих физических лиц, требует законного основания.
Перед началом работы с любым сайтом под защитой Kasada:
- Проверьте
robots.txtи Terms of Service. - Убедитесь, что ваши действия не нарушают закон.
- Соблюдайте разумные лимиты запросов.
- Не собирайте персональные данные без правового основания.
Дополнительные рекомендации по легитимному веб-скрапингу — в нашем руководстве по веб-скрапингу и SERP-трекингу. Техническая документация ProxyHat доступна на docs.proxyhat.com.
Ключевые выводы
- Kasada — многоуровневая система: IP-репутация → TLS/JA4 → ips.js VM → постоянная валидация через x-kpsdk-ct. Каждый уровень должен быть пройден.
- ips.js — ~449KB байткод-VM с зашифрованными строками, time-based seeds и integrity checks. Подделать output невозможно — нужно выполнять в реальном браузере.
- 429 с x-kpsdk-ct означает провал токена челленджа. Не повторяйте запросы — перезапустите сессию с новым IP.
- Дата-центр прокси бесполезны против Kasada. Нужны резидентные или мобильные IP с реальными ISP-ASN.
- ProxyHat SOCKS5 :1080 + Playwright с stealth-настройками — рабочий стек для легитимной автоматизации.
- Согласованность — ключевой принцип: IP, Timezone, язык, User-Agent, JA4-хеш и canvas-фингерпринт должны образовывать непротиворечивую картину.
- Этика и закон — kasada bypass только для авторизованного тестирования и сбора публичных данных. CFAA и GDPR применяются.
Часто задаваемые вопросы
Что такое Kasada Anti-Bot и как он работает?
Kasada — это платформа защиты от ботов, использующая многоуровневую архитектуру: TLS/HTTP2-фингерпринтинг (JA3/JA4), оценку IP-репутации по ASN, и JavaScript-челлендж ips.js — кастомную байткод-VM объёмом ~449KB, которая собирает фингерпринт браузера и устройства, генерирует зашифрованные токены и устанавливает cookie KP_UIDz. Заголовки x-kpsdk-ct, x-kpsdk-cd и x-kpsdk-dv передают валидные токены сессии при каждом запросе.
Почему Kasada Anti-Bot важен для пользователей прокси?
Kasada предварительно блокирует дата-центр ASN и сильно взвешивает IP-репутацию при оценке доверия. Это означает, что дата-центр прокси практически бесполезны против защищённых Kasada сайтов. Резидентные прокси с реальными ISP-IP необходимы для прохождения начального уровня проверки, а полный kasada bypass требует также корректного TLS-фингерпринта и выполнения ips.js в реальном браузере.
Какой тип прокси лучше всего работает с Kasada?
Резидентные прокси — единственный надёжный выбор для сайтов под защитой Kasada. Они предоставляют IP-адреса реальных ISP, что позволяет пройти проверку репутации ASN. Мобильные прокси также эффективны благодаря высокому доверию к мобильным сетям. Дата-центр прокси почти всегда отклоняются на этапе IP-скрининга до выполнения JavaScript-челленджа.
Как избежать блокировок при работе с Kasada Anti-Bot?
Используйте резидентные прокси с ротацией сессий, реальный браузерный рантайм (Playwright/Puppeteer) для выполнения ips.js, согласованный TLS-фингерпринт через браузер, а не HTTP-клиенты, и придерживайтесь разумных лимитов запросов. Полученный cookie KP_UIDz и заголовки x-kpsdk-ct нужно корректно передавать во всех последующих запросах. Избегайте повторных 429 ответов — каждый неудачный запрос снижает IP-репутацию.
Что означает ответ 429 с заголовком x-kpsdk-ct?
Ответ 429 с заголовком x-kpsdk-ct указывает, что сгенерированный ips.js токен оказался недействительным или истёк. Это означает, что либо ips.js не выполнился корректно в браузере, либо cookie KP_UIDz устарел, либо IP-репутация упала ниже порога. Необходимо перезапустить челлендж через новый браузерный контекст с новой резидентной IP-сессией.






