阿里云验证码如何保护报名接口
阿里云验证码如何保护报名接口
某比赛报名平台的热门赛事经常秒没,想写个自动报名脚本。逆向分析后发现,整个防护链条中真正无法绕过的环节是阿里云验证码。本文重点分析这一机制。
报名流程概览
平台使用 GraphQL API,报名分三步:
- 轮询赛事状态 — 等待”报名中”
- 获取 token — 需通过验证码,后端签发一次性 token
- 提交报名 — 携带 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) | ❌ 不能 | 阿里云服务端签发,见下方分析 |
为什么验证通过凭证无法伪造?
-
服务端签发 — 凭证由阿里云服务端生成,使用的密钥不在客户端任何地方出现。你能拿到 SDK 里的 AccessKeySecret(用于请求签名),但那不是用来签发验证凭证的密钥。
-
行为判定不可绕过 — 阿里云根据滑动轨迹的真实性来决定是否签发凭证。就算你成功调用了 InitCaptcha 和 VerifyCaptcha 接口,如果滑动轨迹被判定为机器行为,也拿不到通过凭证。
-
时效性 — 凭证有过期时间,且与 CertifyId 绑定,用一次即失效。不能重放。
-
二次校验 — 即使你构造了一个格式正确的假凭证传给业务后端,业务后端会向阿里云确认。阿里云那边没有这条通过记录,校验失败。
实际可行的方案
| 方案 | 可行性 | |
|---|---|---|
| 纯脚本伪造请求 | ❌ 无法获得验证凭证 | |
| Playwright/Selenium 自动化 | ✅ 真实浏览器 + 模拟真人轨迹完成滑动 | |
| 手动完成验证 + 脚本极速提交 | ✅ 人工过验证码,脚本抢速度 | (这是ai给的方案,我觉得不太可行吧?) |
全文完