Logo GH

Bot Protection и антифрод API

1) Зачем это нужно

Боты и злоумышленники атакуют входные точки роста и денег: регистрацию, логин (ATO), депозиты/выводы, промо-механику, каталоги игр/коэффициентов. Ручные правила и чистый rate limit уже недостаточны: нужны многоуровневые сигналы, скоринг в реальном времени и контроль решения (allow/deny/challenge/throttle) с обратной связью от бизнес-событий (чарджбэки, chargeback-ratio, KYC-фейлы).

2) Таксономия угроз

Регистрация/онбординг: массовые аккаунты, одноразовые e-mail/сим-банки, фермы девайсов.
ATO (Account Takeover): credential stuffing, password spraying, session hijack.
Бонус-абьюз: мультиаккаутинг, арбитраж гео/юрисдикций, self-exclusion обход.
Картинг/платежный фрод: тест карт, ворованные кошельки, возвраты средств.
Скрейпинг/инвентарь: агрессивное вытягивание контента, цен, коэффициентов.
API-DoS низкой интенсивности: черепашьи атаки, slow-POST, эмуляции мобильных SDK.
Вебхуки/интеграции: подделка уведомлений без HMAC/mTLS, replay.

3) Архитектура защиты

3.1 Слои

1. Edge (CDN/WAF/шлюз): ранние отказы (ASN/Geo/IP-репутация), легкие челленджи, лимиты, PoW.
2. Risk API (PDP по риску): централизованный движок правил/ML; ответ — `decision`, `score`, `reason`, `ttl`.
3. App-уровень: доменные инварианты, бизнес-логика (лимиты, KYC, AML), асинхронные ревью.
4. Поток событий: Kafka/Kinesis → feature store/модель → обратная связь от платежей/диспутов.

3.2 Контур решения


[Request] → Edge Plugins → (enrich) → Risk API (rules+ML) → Decision:
allow      deny      throttle      challenge(type=captcha    sms    PoW    biometry)

Решение кэшируется по ключу (например, device×account×route) на `ttl` секунд.

4) Сигналы и обогащение

Сеть/канал: IP/ASN, прокси/VPN/Tor, rdns, rtt/jitter, SYN-rate, TLS-фингерпринт (JA3/JA4), HTTP/2/3 поведение.
Девайс/браузер: canvas/audio/WebGL FP (бережно), платформа/SDK, timezone/locale, разрешение, шрифты, WebDriver/hеadless индикаторы, mobile attestation (SafetyNet/DeviceCheck, по возможности).
Поведение: скорость ввода, траектории мыши/тач, последовательность экранов, dwell-time, частота попыток, переходы между браузерными идентификаторами.
Контент/запрос: форма e-mail/домен, disposable-провайдеры, phone HLR/или тип номера, BIN карты, счет/IBAN в санк-реестрах, схожесть ФИО/адресов.
Аккаунт/история: возраст аккаунта, KYC-статус, ретеншн, ARPPU, velocity по депозитам/выводам/бонусам.
Внешние источники: списки компрометации (HIBP-подобные), платежные рисковые сигналы (PSP), ASN-репутация.

5) Решение: правила + ML

5.1 Правила (детерминированные)

Velocity: «N регистраций с /24 за 10 мин», «M логинов с одним девайсом к X аккаунтам», «K 3DS-фейлов подряд».
Гео/юрисдикция: конфликты IP-гео vs адрес/документ, внезапные прыжки местоположения.
Бизнес-инварианты: лимиты ответственных платежей, self-exclusion, санкционные списки.

5.2 ML-скоринг (реал-тайм)

Легкая модель (GBM/логрег) на онлайн-признаках: `ip_risk`, `device_age`, `account_age`, `pwd_fail_rate`, `bin_risk`, `velocity_`, `behavioral_`.
Отдельная модель для ATO и отдельно — для платежей/выводов.
Сегментация по юрисдикции/тенанту (пер-рынок калибровка порогов).

5.3 Принятие решения


if ip_blacklisted or bad_asn then deny else if rule_severe then challenge(hard)
else if score >= 0. 9 then deny else if 0. 7 <= score < 0. 9 then challenge(soft)
else allow

При `challenge` хранить факты прохождения/провала; эскалировать/снижать трение динамически.

6) Velocity и квоты (ключи и окна)

Ключи: `ip`, `ip/24`, `device_id`, `account_id`, `payment_instrument`, `email_domain`, `bin`.
Окна: скользящие (1м/5м/1ч/24ч) + отдельные «burst»/«sustained».
Политики: «жесткие» deny на горячих маршрутах (логин/депозит), мягкие throttle на контенте.

Пример Redis-правила (псевдо):
pseudo allow, retry_after = gcra_allow(key="login:ip:"+ip, rate=60/min, burst=30)
if not allow:
return 429, {"Retry-After": retry_after}

7) Челленджи и проверка «человечности»

CAPTCHA/turnstile: как soft-challenge; убирать после высокой уверенности в «чистой» сессии.
Proof-of-Work (PoW): для API/скриптов — вычислить хэш с заданной сложностью; динамическая сложность при росте нагрузки.
OTP/SMS/Email/Push: для ATO/критичных операций; не злоупотреблять (стоимость/UX).
WebAuthn/биометрия: высокий уровень уверенности на cash-out/изменение payout-деталей.
Device trust: bind аккаунта к проверенному девайсу; новые девайсы → challenge.

8) Интеграция в шлюз/прокси

8.1 Envoy: ext_authz → Risk API (псевдо)

yaml http_filters:
- name: envoy. filters. http. ext_authz typed_config:
http_service:
server_uri: { uri: http://risk-api:8080, cluster: risk, timeout: 80ms }
authorization_request:
allowed_headers:
patterns:
- exact: "x-tenant"
- exact: "x-device-id"
- exact: "user-agent"
authorization_response:
allowed_upstream_headers:
patterns: [{ exact: "x-risk-score" }, { exact: "x-risk-decision" }]
- name: envoy. filters. http. router

8.2 NGINX/Lua: легкий PoW и velocity

nginx lua_shared_dict vel 20m;

access_by_lua_block {
local ip = ngx. var. remote_addr if not gcra_allow("reg:ip:"..ip, 20, 40) then ngx. header["Retry-After"] = 30; return ngx. exit(429)
end

local pow = ngx. req. get_headers()["X-POW"]
if not verify_pow(pow, ngx. var. request_id, 18) then ngx. status = 401; ngx. say('need-pow'); return ngx. exit(401)
end
}

9) Контракт Risk API

Запрос (обогащенный):
json
{
"tenant":"eu-1",
"route":"POST /v1/login",
"subject":{"account_id":"a123","email":"u@d. com"},
"device":{"id":"d-xyz","fp":"...","ja3":"...","headless":false},
"network":{"ip":"203. 0. 113. 10","asn":12345,"country":"DE","rtt_ms":42},
"context":{"fail_5m":3,"pwd_reset_24h":1}
}
Ответ:
json
{ "decision":"challenge", "score":0. 83, "reason":"high_velocity+new_device", "ttl_sec":900, "challenge":"captcha" }

10) Данные, фичи и модели

Feature Store (онлайн): Redis/Scylla/KeyDB — счетчики/velocity/временные метки.
Batch/офлайн: DWH (BigQuery/S3+Athena) для обучения/рефитов; храните метки оттока, chargeback, ручных ревью.
Модели: простые для real-time (логрег/GBM); тяжелые (XGBoost/NN) — офлайн с PGMs/шкалированием и последующей дистилляцией.
Контроль дрифта: PSI, AUC/PR, калiбровка порогов по регионам/каналам.

11) Наблюдаемость и операционный контур

Метрики:
  • `risk_requests_total{route,decision}`
  • `risk_score_bucket` (distribution)
  • `waf_block_total`, `velocity_block_total`, `challenge_pass_rate`
  • `ato_incidents`, `carding_detected`, `cashout_denied`
  • бизнес-метрики: `chargeback_rate`, `bonus_abuse_rate`, `false_positive_rate`
  • Логи (редактированные): `decision`, `score`, ключевые сигналы, `trace_id`, без PII/секретов.
  • A/B и Shadow: новая политика в shadow-режиме (логируем решения), потом canary (1–5%), автороллбек по SLO/FP.
  • Playbooks: эскалация, временное ужесточение, откат, «виртуальные патчи».

12) Приватность и соответствие

Минимизируйте PII; хешируйте устойчивые идентификаторы (например, email SHA-256 с солью).
Уважайте региональную юрисдикцию (локализация данных, согласия).
Прозрачные объяснения решений для ручных ревью; храните только необходимое и с TTL.

13) Специфика iGaming/финансов

Регистрация: фильтры disposable e-mail/VoIP, velocity по /24, девайс-фермы → challenge/deny.
Логин/ATO: новые девайсы/гео-скачки → OTP/WebAuthn; password spraying → throttle/deny.
Бонусы: лимиты на «путь к отмыванию» (депозит→бонус→минимальный оборот→вывод), graph-анализ аффилированности (адреса/девайсы/карты).
Платежи/выводы: BIN-риск, country-mismatch, PSP-сигналы; cashout на новый инструмент → высокий порог и чекап KYC.
Вебхуки PSP/KYC: HMAC + mTLS, узкие IP-allow-лист, anti-replay (`X-Timestamp`, окно ±5 мин).

14) Антипаттерны

Один универсальный captcha «везде и всегда» → высокий FP/падение конверсии.
Только rate limit без поведенческих/девайсных сигналов.
Хранение «сырых» отпечатков и PII бессрочно.
Отсутствие shadow-прогона и canary для новых политик.
Полное доверие внешним «репутационным» меткам без собственной валидации.
Принятие решений на клиенте (JS/мобильный SDK) без серверной проверки.

15) Примеры правил и псевдокод

15.1 Композитное правило (реал-тайм)

pseudo score = 0 if ip_asn in bad_asn_list then score += 0. 5 if device_age < 1d and route in {login, withdraw} then score += 0. 3 if velocity("login:account", 5m) > 10 then score += 0. 3 if geovelocity(last_login_loc, current_loc) > 800km/h then score += 0. 2 decision = score>=0. 9? "deny": score>=0. 7? "challenge": "allow"

15.2 Граф связей (мультиаккаунт)


edge(accountA, deviceX)
edge(accountB, deviceX)
edge(accountB, cardY)
edge(accountC, cardY)
Threshold by common nodes → investigation/deny bonus

16) Чек-лист prod-готовности

  • Многоуровневая архитектура: Edge → Risk API → App, поток событий.
  • Сигналы: сеть, девайс, поведение, контент, платеж; минимизация PII.
  • Velocity/GCRA на ключах ip/device/account/payment, скользящие окна.
  • Решения: allow/deny/challenge/throttle; кэш решений с TTL; хранилище фактов челленджей.
  • Челленджи: captcha/PoW/OTP/WebAuthn; динамическая сложность.
  • Risk API: SLA <100 мс, кэш, деградация в «минимально безопасный» режим.
  • Наблюдаемость: метрики risk, FP/FN, дашборды, алерты; бизнес-метрики (chargeback/bonus-abuse).
  • Shadow → canary → enforce; плейбуки эскалации и отката.
  • Вебхуки PSP/KYC: HMAC+mTLS+anti-replay+allow-list.
  • Региональные требования и TTL на чувствительные данные.

17) TL;DR

Стройте слоистую защиту: ранние edge-фильтры и челленджи, централизованный Risk API с правилами+ML и поток событий для обратной связи. Используйте velocity-лимиты, сигналы сети/девайса/поведения, динамические challenge (captcha/PoW/OTP/WebAuthn). Принимайте решения allow/deny/challenge/throttle, меряйте FP/FN и бизнес-эффект, раскатывайте через shadow/canary. Для платежных/бонусных путей — отдельные ужесточенные профили и связка с KYC/AML.

Contact

Свяжитесь с нами

Обращайтесь по любым вопросам или за поддержкой.Мы всегда готовы помочь!

Telegram
@Gamble_GC
Начать интеграцию

Email — обязателен. Telegram или WhatsApp — по желанию.

Ваше имя необязательно
Email необязательно
Тема необязательно
Сообщение необязательно
Telegram необязательно
@
Если укажете Telegram — мы ответим и там, в дополнение к Email.
WhatsApp необязательно
Формат: +код страны и номер (например, +380XXXXXXXXX).

Нажимая кнопку, вы соглашаетесь на обработку данных.