阿里云验证码如何保护报名接口

某比赛报名平台的热门赛事经常秒没,想写个自动报名脚本。逆向分析后发现,整个防护链条中真正无法绕过的环节是阿里云验证码。本文重点分析这一机制。

报名流程概览

平台使用 GraphQL API,报名分三步:

  1. 轮询赛事状态 — 等待”报名中”
  2. 获取 token — 需通过验证码,后端签发一次性 token
  3. 提交报名 — 携带 token + 选手信息

第 1、3 步都是普通的 API 调用,没有防护。关键在第 2 步——获取 token 时需要传一个 captchaVerifyParam 参数,这就是阿里云验证码的验证结果。

阿里云验证码(Captcha V3)完整流程

第一步:初始化

前端加载阿里云验证码 SDK 后,SDK 自动采集浏览器指纹生成 DeviceToken,然后向阿里云发起初始化请求:

POST https://7fxhzk.captcha-open.aliyuncs.com/

Action=InitCaptchaV3
AccessKeyId=LTAI5tSEBwYMwV...    # 业务方的阿里云 AccessKeyId
SceneId=rs47dl4z                  # 业务方配置的验证场景
DeviceToken=<浏览器指纹>           # SDK 采集
Signature=<HMAC-SHA1签名>          # SDK 内部计算

返回:

{
  "CertifyId": "c83uk3yrIV",
  "CaptchaType": "SLIDING",
  "Success": true
}

阿里云分配了一个会话 ID(CertifyId),并告知验证类型为滑动验证。

第二步:用户完成滑动

页面展示滑块拼图,用户拖动滑块到正确位置。这一步中,SDK 在后台记录:

  • 鼠标/触摸轨迹坐标序列
  • 每个采样点的时间戳
  • 滑动速度和加速度变化
  • 按压时长、抖动特征

用户松手后,SDK 将这些行为数据打包发送给阿里云服务端。阿里云基于这些特征判定是否为真人操作。

如果判定失败(轨迹太规则、速度太均匀等机器特征),会:

  • 提示”验证失败,请重试”
  • 可能升级难度(从滑块变为文字点选等)

如果判定通过,阿里云服务端返回一个签名凭证data)给前端 SDK。

第三步:前端拼装 captchaVerifyParam

SDK 将各阶段信息拼成一个 JSON 字符串,交给业务方前端:

{
  "sceneId": "rs47dl4z",
  "certifyId": "c83uk3yrIV",
  "deviceToken": "<浏览器指纹>",
  "data": "<阿里云签发的验证通过凭证>"
}

业务方前端将这个 JSON 字符串作为 captchaVerifyParam,连同其他参数一起发送给自己的后端。

第四步:服务端二次校验

业务方后端收到 captchaVerifyParam 后,不会直接信任前端传来的结果。而是使用自己的 AccessKeySecret,向阿里云发起服务端验证请求(VerifyIntelligentCaptcha API):

"这个 certifyId 对应的验证确实通过了吗?"

阿里云确认后,业务方后端才签发 signupToken

哪些能伪造,哪些不能

参数 能否伪造 原因
AccessKeyId ✅ 能 硬编码在前端 JS 中,公开值
SceneId ✅ 能 固定值,写在前端配置里
DeviceToken ✅ 能 前端 SDK 生成的浏览器指纹,可以伪造或复用
Signature ✅ 能 AccessKeySecret 混淆在 SDK 的 JS 中,理论上可逆向提取
验证通过凭证(data) 不能 阿里云服务端签发,见下方分析

为什么验证通过凭证无法伪造?

  1. 服务端签发 — 凭证由阿里云服务端生成,使用的密钥不在客户端任何地方出现。你能拿到 SDK 里的 AccessKeySecret(用于请求签名),但那不是用来签发验证凭证的密钥。

  2. 行为判定不可绕过 — 阿里云根据滑动轨迹的真实性来决定是否签发凭证。就算你成功调用了 InitCaptcha 和 VerifyCaptcha 接口,如果滑动轨迹被判定为机器行为,也拿不到通过凭证。

  3. 时效性 — 凭证有过期时间,且与 CertifyId 绑定,用一次即失效。不能重放。

  4. 二次校验 — 即使你构造了一个格式正确的假凭证传给业务后端,业务后端会向阿里云确认。阿里云那边没有这条通过记录,校验失败。

实际可行的方案

方案 可行性  
纯脚本伪造请求 ❌ 无法获得验证凭证  
Playwright/Selenium 自动化 ✅ 真实浏览器 + 模拟真人轨迹完成滑动  
手动完成验证 + 脚本极速提交 ✅ 人工过验证码,脚本抢速度 (这是ai给的方案,我觉得不太可行吧?)

全文完