Bot Protection和antifrod API
1)为什么需要它
机器人和攻击者攻击增长和金钱的输入点:注册,登录(ATO),存款/结论,促销机制,游戏/系数目录。手动规则和净利率限制已经不足:需要分层信号,实时得分和决策控制(allow/deny/challenge/throttle),并得到业务事件(chargebacks,chargeback-ratio,KYC feils)的反馈。
2)威胁分类
注册/登录:大众账户,一次性电子邮件/SIM银行,魔术场。
ATO (Account Takeover): credential stuffing, password spraying, session hijack.
Bonus Abuse:多次出庭,地理/司法套利,自我释放旁路。
卡丁车/支付额: 卡测试,偷钱包,退款.
Scraping/库存:积极拉动内容、价格、比率。
低强度API-DoS:乌龟攻击,慢开机,移动SDK仿真。
Webhooks/集成:在没有HMAC/mTLS, replay的情况下伪造通知。
3)保护体系结构
3.1层
1.边缘(CDN/WAF/网关):早期故障(ASN/Geo/IP声誉),轻挑战赛,限制,PoW。
2.风险API (PDP): 集中的规则/ML引擎;ответ — `decision`, `score`, `reason`, `ttl`.
3.应用级别:域不变量,业务逻辑(限制,KYC,AML),异步评论。
4.事件流:Kafka/Kinesis →功能商店/模型→付款/发行反馈。
3.2解决方桉概述
[Request] → Edge Plugins → (enrich) → Risk API (rules+ML) → Decision:
allow deny throttle challenge(type=captcha sms PoW biometry)
解决方案通过键(例如,设备×帐户×路线)缓存"ttl"秒。
4)信号与富集
网络/通道:IP/ASN,代理/VPN/Tor,rdns,rtt/jitter,SYN-rate,TLS fingerprint(JA3/JA4),HTTP/2/3行为。
Devays/Browser: canvas/audio/WebGL FP(精益),平台/SDK, timezone/locale,分辨率,字体,WebDriver/headless指示器,移动适应(SafetyNet/DeviceCheck,如果可能)。
行为:输入速度,鼠标/触摸轨迹,屏幕序列,dwell-time,尝试频率,浏览器标识符之间的转换。
内容/查询:电子邮箱表格/域名,可拆卸提供商,电话HLR/或号码类型, BIN卡,帐户/IBAN在冰箱注册表,类似于FIO/地址。
帐户/历史记录:帐户年龄,KYC状态,重组,ARPPU,按存款/结论/奖金排序。
外部来源:损害清单(类似HIBP),支付风险信号(PSP),ASN声誉。
5)解决方桉: 规则+ML
5.1规则(确定性)
Velocity:"N 注册从/24到10分钟","M登录到X帐户","K 3 DS连续"。
地理/管辖权:IP地理vs地址/文档冲突,突然的位置跳跃。
业务不变性: 负责任的支付限额,自我释放,制裁名单.
5.2个ML得分(real time)
在线特征上的轻型模型(GBM/logreg):"ip_risk","device_age","account_age","pwd_fail_rate","bin_risk","velocity_","behavioral_"。
ATO的单独模型,以及付款或结算的单独模型。
按管辖权/tenant进行细分(阈值校准的per市场)。
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
在"挑战"中保留通过/失败的事实;动态升级/减少摩擦。
6)Velocity和配额(密钥和窗口)
Ключи: `ip`, `ip/24`, `device_id`, `account_id`, `payment_instrument`, `email_domain`, `bin`.
窗口:滑动(1m/5m/1h/24 h)+单独的"burst"/"sustained"。
政客:热路线上的"强硬"deny(登录/存款),内容上柔软的throttle。
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;在对"干净"会议充满信心之后进行清理。
工作证明(PoW):对于API/脚本-计算具有给定复杂性的哈希;负载增加时的动态复杂性。
OTP/SMS/电子邮件/推送:用于ATO/关键操作;不要滥用(成本/UX)。
WebAuthn/生物识别技术:对现金流出/付款细节变更的高度信心。
设备信托:对经过验证的设备进行分类帐户;新的魔鬼→挑战。
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)数据,fici和模型
功能商店(在线):Redis/Scylla/KeyDB-计数器/velocity/时间戳。
Batch/离线: DWH(BigQuery/S3+Athena)用于培训/反射;储存流出标记,chargeback,手动咆哮.
模型:易于实时(logreg/GBM);重型(XGBoost/NN)-离线,带有PGMs/量表和随后的蒸馏。
漂移控制:PSI,AUC/PR,通过区域/渠道对阈值进行排序。
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"
- Logi(已编辑):"决策","得分",关键信号"trace_id",没有PII/秘密。
- A/B和Shadow:阴影模式下的新政策(我们计算解决方案),然后是金丝雀(1-5%),SLO/FP自动后卫。
- Playbooks:升级、临时收紧、回滚、"虚拟补丁"。
12)隐私和合规性
尽量减少PII;散列可持续标识符(例如电子邮件SHA-256盐)。
尊重区域管辖权(数据本地化、同意)。
对手动咆哮解决方案的透明解释;仅存储必需的TTL。
13) iGaming/财务细节
注册:可泄露的电子邮件/VoIP过滤器,velocity/24,魔法场→挑战/恶作剧。
Login/ATO: 新功能/地理飞跃→ OTP/WebAuthn;password spraying → throttle/deny.
奖金:"洗钱之路"(depozit→bonus→minimalnyy oborot→vyvod)的限制,隶属关系的图形分析(地址/devays/Card)。
付款/结论:BIN风险,country-mismatch,PSP信号;新工具→高阈值和KYC跳跃。
PSP/KYC webhooks:HMAC+mTLS,狭窄的IP allow列表,反复制("X-Timestamp",窗口± 5分钟)。
14)反模式
一个通用的captcha"无处不在"→高FP/转换下降。
仅限利率,没有行为/失态信号。
"原始"印刷品和PII的存储是无限期的。
新策略缺乏阴影运行和金丝雀。
完全信任外部"声誉"标签,没有自己的验证。
客户端决策(JS/mobile SDK)无需服务器验证。
15)规则示例和伪代码
15.1复合规则(real time)
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)准备就绪支票清单
- 分层体系结构:Edge → Risk API → App,事件流。
- 信号:网络、设备、行为、内容、付款;PII的最小化。
- Velocity/GCRA在ip/device/account/payment密钥上,滑动窗口。
- 决定:allow/deny/challenge/throttle;TTL解决方桉缓存;挑战事实资料库。
- 挑战:captcha/PoW/OTP/WebAuthn;动态复杂性。
- 风险API:SLA <100 ms,缓存,降级为"最小安全"模式。
- 观察力:风险、FP/FN、dashbords、Alerta的指标;业务指标(chargeback/bonus-abuse)。
[] Shadow → canary → enforce;升级和回滚的花花公子。
- PSP/KYC Webhooks:HMAC+mTLS+anti-replay+allow-list。
- 敏感数据的区域要求和TTL。
17) TL;DR
构建分层保护:早期的边缘过滤器和挑战,集中的带有+ML规则的Risk API和用于反馈的事件流。使用velocity 极限、网络/devys/行为信号、动态挑战 (captcha/PoW/OTP/WebAuthn)。决定allow/deny/challenge/throttle,测量FP/FN和业务效果,通过影子/金丝雀推出。对于支付/奖励路径-与KYC/AML的单独收紧配置文件和捆绑。