最近不少做业务风控的朋友来问我:“A2.0那个系统到底怎么破?”每次听到这种问题,我都会先反问一句:你是想绕过它,还是想弄明白它为什么能拦住你?这两个方向完全不同。一个是黑产关注的事,一个是安全团队该做的事。这篇文章我只聊后者,并且把话放在前面:我不会分享任何绕过风控的方案。研究一个反爬系统,最有价值的姿态不是想着怎么钻空子,而是把它当成一个黑盒,站在防御者的角度一层层拆开,看它为什么这么做、在哪些环节可能失效,然后反哺到自己的防护体系里。这才是“破解分析”四个字真正该有的含义。
我接下来要讲的,是一个代号叫A2.0的产品。它是某国际云安全厂商推出的Bot管理解决方案的2.0版本,在不少大型网站的请求链路里都能看到它的影子。做爬虫对抗的同学对这个体系不陌生,但大多数人的理解停留在“网页上会出一段JS验证”这个层面。实际上这只是冰山一角。这篇文章适合三类人:刚接手业务安全、需要评估现有风控能力的工程师;被恶意爬虫搞得焦头烂额、想了解商业方案怎么设计的运维负责人;以及纯粹对反爬机制感兴趣、想建立系统认知的技术爱好者。读完你会知道A2.0这类产品一共分几层、每层在干什么、接入时有哪些选择、上线后比较容易踩哪些坑。
1. 先搞清楚A2.0到底在防什么
1.1 它防的不是所有爬虫
很多人一提“反爬虫”就默认要把所有自动化流量全部干掉,这是最大的误解。A2.0的定位是一个流量分类器,它的目标不是“拒绝所有机器人”,而是把流量分成几类:搜索引擎的爬虫、支付回调、监控系统的探针,这类是“好机器人”,要放行;恶意抓取、撞库、刷接口、刷券,这类是“坏机器人”,要拦截;剩下的是真实用户,要尽量不打扰。
这个分类逻辑是所有风控产品的根基。如果一刀切把所有自动化请求全封掉,搜索引擎收录会掉、第三方回调会断、业务监控会失灵,损失远大于爬虫带来的伤害。所以A2.0在配置层面允许你针对不同的UA、不同的来源IP、不同的API路径分别设置策略。它在2.0版本里做的事,本质上就是把“分类”这件事做得更细,增加设备指纹、行为模型和动态决策,让规则不再是简单的IP维度。
理解这一点很重要,因为很多团队第一次接入商业风控时,喜欢把阈值调得很激进,结果正常用户被大量拦截。问题不在产品,而在使用方没搞明白它设计的初衷是分类,不是封杀。
1.2 为什么很多团队只盯着“JS挑战”
在网页端,用户感知最强烈的防护手段,就是那个会弹出来、要求你等待几秒或者做一次点击验证的JavaScript挑战。所以不少人以为A2.0的核心就是这段JS。但如果你把整个请求链路画出来,会发现JS挑战只是第一个关卡,它存在的目的不是证明你是真人,而是为后续的风险决策提供一个可信的“令牌”。
我习惯把A2.0的工作流程类比成机场安检。JS挑战是登机口的证件扫描,先确认你“带了证件”;指纹采集是安检仪,看你“身上有没有异常”;行为分析是边检人员盯着你走路的姿势,判断你是不是紧张。三道程序是递进关系,任何一道卡住都有替代方案。攻击者往往花费大量精力去模拟那段JS返回的令牌,以为过了这一关就畅通无阻,结果发现后续还有指纹校验、行为频控在等着。防御方如果没有这个全局视角,也很难理解为什么明明“挑战通过了”还是被判成爬虫。
这也是为什么我在接下来的章节里,会把A2.0的核心拆分到三个层面来讲,而不是只讲那个看得见的JS验证。
2. A2.0的三个核心防护模块拆解
2.1 动态挑战与令牌校验
A2.0在网页端最常见的行为,是向客户端下发一段由服务端动态生成的脚本,脚本会在浏览器环境里收集一些信息,然后生成一段带签名和时间因子的令牌,通过请求头或Cookie带回给服务端。服务端验证通过后,才继续处理业务请求。
动态是这里的关键。脚本每次返回的内容都不一样,参数名、加密逻辑、令牌结构可能会变化,这就让“保存一份JS然后重放”的简单攻击方式失效。很多做模拟请求的同学第一个坑就是在这里:拿昨天的JS脚本放到今天的环境里,跑不通,因为生成令牌时依赖了时间戳和随机数,服务端会校验新鲜度。
从防御角度看,动态挑战最需要关注的是令牌的生命周期和校验强度。如果令牌有效期太长,比如超过10分钟,攻击者就有充足时间拿去建模;如果太短,正常用户网络慢一点就会频繁触发挑战,体验很差。我见过一个案例,业务方为了安全把令牌有效期设成30秒,结果用户从点击到提交表单稍微犹豫一下就被踢出去,最后只能调回3分钟。这里没有标准答案,需要根据业务特征反复调。
2.2 设备指纹与网络行为采集
第二层是设备指纹。A2.0会在用户访问时采集浏览器的Canvas、WebGL、字体、时区、屏幕分辨率、AudioContext等基础信息,也会读取Cookie、LocalStorage里之前种下的标记。在App端,则通过SDK采集设备型号、系统版本、传感器数据、IDFA/OAID等。
光有这些还不够,2.0版本还引入了网络侧的指纹特征,比如TLS握手指纹、HTTP/2帧行为、TCP窗口大小。这层为什么要单独做?因为很多在浏览器层伪装得很好的攻击者,到了网络层就会露出马脚。比如用开源框架发请求,HTTP/2的帧顺序和浏览器差异很大,哪怕UA伪装得再像,网络特征也能把它从人群里分出来。
这部分的难点在稳定性。一台真实的显示器,同一台机器不同时间段访问,Canvas指纹也可能有细微漂移;同一个机房出来的多台机器,如果装了相同虚拟机镜像,指纹可能高度相似。A2.0要做的不是单点比对,而是把几十个特征组合起来,算一个相似度分数。作为防御方,要重点观察的也是这个分数:它是不是能在真实用户之间维持合理区分度,而不至于把同一大楼里用同款设备的同事全判成同一台机器。
2.3 行为模型与风险决策
第三层是行为层,也是A2.0最像“智能风控”的地方。它不再看单次请求,而是看一段时间内访问者的行为序列:页面停留时长、鼠标移动轨迹、点击间隔、请求路径是否刻意绕开某个接口、单位时间内触发接口的次数、API调用顺序是否符合正常业务逻辑。
这些数据会进入一个风险打分模型,输出一个从“完全可信”到“高度风险”的分数,再映射到四档动作:直接放行、发起一次轻量挑战、弹出二次验证码、阻断并返回403。这四档动作是可以在控制台里按业务场景调整的。比如登录接口,可以要求相对严格,只要分数不够可以直接弹验证码;但商品列表页,可能只需要挑战或者放行,避免影响正常浏览。
2.0版本相比早期版本的进步在于,决策引擎可以在线学习。也就是说它不只是靠静态规则命中,还会根据新的攻击样本自动调整特征权重。这对防护方是好事,但对配置方提出了新要求:你得给它足够多的、打了标签的流量样本,否则模型学出来的东西可能和业务预期不符。
下表把三个模块放到一起看,会更直观:
| 防护模块 | 采集位置 | 核心数据 | 主要失效场景 |
|---|---|---|---|
| 动态挑战 | 网页端脚本 | 时间戳、随机数、浏览器环境 | 重放旧令牌、脚本执行环境不完整 |
| 设备指纹 | 浏览器/App SDK | Canvas、WebGL、网络指纹 | 指纹漂移、同型号设备误判 |
| 行为模型 | 服务端时序数据 | 鼠标轨迹、请求间隔、路径序列 | 数据样本不足、规则过严误伤 |
3. 从接入角度看几种典型的解决方案
3.1 反向代理模式:最快见效的方案
对绝大多数Web站点,A2.0最常见的接入方式是通过反向代理。业务方只需要把域名的DNS解析指到A2.0边缘节点,源站保持原有架构不动。所有请求先经过边缘节点,由它完成挑战、指纹采集和行为分析,再把合法请求转发到源站。
这种模式最大的好处是上线快。某公司一个线上活动页被爬虫刷得没法看,运维团队只花了一个下午改DNS,第二天恶意流量就被挡在了边缘。不需要改动业务代码,也不涉及开发排期。但代价是链路变长了,首次请求会多一次TLS握手和边缘处理,延迟平均增加30到80毫秒。对于电商大促这种敏感场景,需要提前压测确认影响。
另外要注意证书管理。反向代理意味着源站证书要放在边缘节点,业务方需要接受证书由服务商托管,或者上传自己的证书。有些客户对证书私钥有合规要求,就会改用后面的API模式。
3.2 API网关模式:适合移动端和开放接口
App端的风控不适合用纯反向代理,因为App发起的HTTPS请求通常做了证书绑定,直接劫持会触发客户端报错。A2.0提供的第二种方案是API网关模式:在业务API前面增加一层专门的API防护入口,客户端集成一份轻量SDK,每次请求带上SDK生成的签名和风控标识。
这个方案的优势是能对单个接口做细粒度控制,比如“/user/login”接口要求严格校验,而“/product/list”可以放宽。同时移动端采集到的设备信息、传感器数据能直接参与风险决策,比Web端更丰富。缺点是需要客户端发版,一旦用户不升级旧版本,SDK能力和新版差距会越来越大,长期维护有一定成本。
我之前处理过一个兼容性问题:某App的新版SDK开始采集Android ID,但Android 10以上系统对标识符访问做了限制,导致部分新机型上报的指纹字段为空,风控模型把这些设备全部判成了“低可信”,频繁弹验证码,用户流失明显。后来调整策略,对缺失字段做了降权处理,才恢复正常。这类问题在API模式下非常常见。
3.3 混合模式:兼顾体验与安全
第三种方案是混合模式,即Web端走反向代理,App端走API网关,同时在源站再加一层自研规则。这种模式适合有成熟安全团队的大型业务,因为商业产品负责通用防护,自研规则覆盖业务特有的风控逻辑,两边互补。
混合模式的一个价值点是可以做渐进式灰度。先在边缘层放一部流量,观察误报率和延迟,再逐步把核心接口切换到严格模式。它避免了“一上线就把业务搞挂”的窘境。代价是架构复杂度上升,需要同时维护两套流量路径,且在源站日志里要能区分请求来源,否则出了问题很难排查。
三种模式我整理成了一张对比表:
| 接入模式 | 改动量 | 延迟影响 | 粒度 | 推荐场景 |
|---|---|---|---|---|
| 反向代理 | 低,仅DNS/证书 | 增加30~80ms | 域名级/路径级 | PC站点、活动页 |
| API网关 | 中,需SDK与签名 | 增加20~50ms | 单API级 | App、开放平台 |
| 混合模式 | 高,需双线维护 | 视架构而定 | 全局+局部 | 大型成熟业务 |
4. 从“破解分析”倒过来看:防护评估的五步自检
4.1 第一步:画清资产入口
做防护评估以前,我建议先画一张流量拓扑图。把公司对外暴露的入口全部列出来:主站、H5活动页、App接口、小程序、开放API、甚至只给内部用的后台。你会发现很多团队以为只有主站需要防爬,结果攻击者绕到H5接口或者App测试环境拿数据。A2.0再强也罩不住你不知道的入口。
画图的时候,还要标注每个入口的业务重要性。登录注册和支付属于高敏接口,策略要最严格;资讯页、分类页属于低敏,可以放宽。这个优先级会直接决定后面配置时的阈值。
4.2 第二步:做一次内部红队验证
“破解分析”更准确的说法是红队评估。在获得授权的前提下,安排测试人员模拟攻击者的常见行为:用脚本直接请求源站、使用无头浏览器加载挑战页、批量尝试登录接口、在同一IP下切换不同指纹。看看现有防护能不能拦住。
这一步的关键是场景要贴近真实攻击。我见过有的团队只测了静态页面,没有测登录接口;有的只测了PC端,没测App。结果真正出事的时候,攻击者走的恰恰是没测过的路径。红队验证不需要用外部流传的破解工具,那些工具本身就是黑灰产,内部团队自己写几个模拟请求脚本就够了。
4.3 第三步:检查指纹的一致性
指纹采集模块上线后,一定要做一致性测试。找几台不同品牌的手机、几台不同配置的电脑,在同一个网络环境反复访问,看返回的指纹ID是不是稳定;再用虚拟机批量开几个实例,看能不能被识别为不同设备。如果指纹ID频繁漂移,说明采集项里有不稳定因子,需要和厂商一起调整特征权重。
我在实际项目中遇到过最典型的漂移来自字体渲染。同一台Mac,外接了不同显示器之后,Canvas返回的像素值会变,指纹ID直接变化。类似问题还有浏览器自动更新后WebGL参数改变。这些都说明,指纹不要求绝对唯一,但要有足够的容错和聚类能力。
4.4 第四步:验证行为模型的区分度
行为模型好不好,可以用一个简单指标衡量:在同样的访问频率下,正常用户和刷量脚本的分数是否有明显分层。如果老用户也被频繁弹验证码,说明模型把正常人的极速操作误判成了爬虫;如果刷量脚本的分数比正常用户还低,那说明特征没选对。
一个常被忽略的点是“人肉爬虫”,人工外包团队通过真手机、真人操作来绕过风控。这种行为模型的难点在于它和正常用户几乎无差别,单靠行为特征很难识别。这时候要结合业务特征,比如注册转化率、浏览路径是否异常统一、账号存活周期等,不能只靠A2.0单一产品解决。
4.5 第五步:确认日志与回溯能力
最后一步,检查每条风控决策是否留痕。A2.0会生成风险记录,包括命中了哪个规则、风险分数多少、最终动作是什么。业务方要把这些日志接入自己的日志平台,和业务日志关联起来,保证出问题时能回溯到具体用户、具体请求ID。
有个案例让我印象很深:某平台上线了风控,随后运营反馈“南北差异巨大”,北方用户拦截率明显高于南方。最初大家都怀疑是规则地域设置问题,后来通过traceId一查,发现是北方某个机房出口IP被运营商统一做了NAT,所有用户看起来都来自同一批IP,连带被行为模型降权。如果没有完整日志,这个问题几乎没法解释。
5. 实际部署中遇到的问题与排查实录
5.1 用户反馈“验证码一直转圈”
上线初期最常见的线上问题是挑战页面加载不出来。用户打开页面,看到一段JS验证一直转圈,等了半天也没放行。排查路径其实不复杂:先看边缘节点是否正常工作,再看页面是否正确加载了挑战脚本,最后看该用户的网络是否能够访问A2.0域名。
有一个很容易踩的坑是浏览器插件拦截。部分广告拦截插件会把挑战脚本当成追踪脚本直接屏蔽,导致令牌生成失败。解决办法是在控制台给挑战脚本加一个不影响功能的白名单请求路径,同时在页面上放一个“加载失败,点击重试”的兜底按钮。否则体验问题会被放大成“风控把用户挡在门外”的差评。
5.2 App接口大量拦截都是正常用户
某客户反馈,App登录接口在发版后一天内拦截率飙升。查下来发现,新版本SDK在冷启动时会先去请求一次风控初始化接口,但部分用户手机系统时间不准,导致SDK生成的签名时间和服务器时间偏差超过5分钟,服务端判定为异常请求。
解决方式有两个:一是客户端在请求签名前先做一次时间同步校准,二是服务端对时间偏差阈值适当放宽。但放宽一定要有限度,如果偏差允许超过10分钟,攻击者伪造时间的难度就会降低。最好的做法是同时开启时钟校准和短期偏差容忍,并对日志里频繁出现时间偏差问题的设备做二次验证。
5.3 拦截率上去了,业务指标掉下来了
这种情况十有八九是把活人误伤成了爬虫。一个比较常见的配置错误是,把“短时间高频访问”这个单条规则设成了硬拦截,没有叠加其他维度。正常人使用浏览器时确实可能在几秒内连续点开多个页面,尤其是有道页面、跳转场景,频率不比爬虫低。
我的建议是刚开始上线时使用观察模式,只记录风险分数和命中次数,不实际拦截;等模型稳定了再切换到挑战模式,最后才上阻断模式。每一步都要对比业务核心指标,比如转化率、停留时长、访问深度。没有任何一个商业风控可以拍着胸脯说“凭感觉设个阈值就行”,调参必须依赖数据。
5.4 攻击者绕过了边缘节点直连源站
这是防护体系里比较致命的一个问题。A2.0只防护经过它自己节点的流量,如果攻击者通过历史DNS记录、SSL证书透明日志、或扫描工具拿到了源站IP,直接构造请求打到源站,所有风控都是摆设。
应对方式很简单但极容易忘:源站防火墙必须只允许边缘节点出口IP访问,同时封禁其他来源的HTTP/HTTPS请求。另外,不要在其他地方暴露源站域名,比如测试环境、staging环境,它们也很容易被搜索引擎收录。上线前最好做一次源站泄露检测,方法是通过第三方威胁情报平台查你和源站有关的SSL证书历史记录。
6. 写在最后:几条个人经验
聊到这里,回头再看“最新版A2.0破解分析”这个标题,我其实更愿意把“破解”理解成“拆解”。一个反爬风控系统的价值不在于让所有攻击者都无计可施,世界上不存在金钟罩,而在于抬高攻击成本,让大多数脚本小子放弃,让专业黑产团队不得不付出足够的代价。A2.0的2.0版本做了很多复杂的设计,但它的核心骨架依然是“挑战+指纹+行为”三层。你只要把这三层的关系想清楚,无论是做防护方案选型还是自研风控,都有方向感。
如果只能记住一条经验:不要和攻击者玩猫鼠游戏,要建设纵深防御。反爬不只是边缘节点的事,源站防护、日志监控、业务异常分析要同步做。另一个经验是风控配置永远不是一次性的,产品上线后每周都要看数据,观察拦截率的波动、正常用户的误伤率是否上升、是否有新的攻击特征出现。安全团队要真正懂业务,才能把阈值调得让攻击者难受,又让用户感觉不到存在。
最后再分享一个细节:在给管理层写风控周报时,除了写“拦截了多少次爬虫”,我还会写“因为风控误伤了多少正常请求”。这个数字越透明,后续团队在调参时就越有底气。一个能持续改进的风控体系,一定是从敢于直面自己误伤数据开始的。