查看注册页源码,能看到一行变量声明把四位验证码写得清清楚楚,输入框随便填,只要和这个变量对上就能过,脚本批量注册一路绿灯。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

curl -X POST https://example.com/register \
  -d 'email=a@b.com&captcha=0000'

验证码在前端生成,答案留在同一个页面的脚本里,校验也在前端做,服务端完全不知道有这个码。抓包重放或者直接调接口都能绕开。这一点先确认清楚,后面就不用反复试。

「前端生成验证码」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,验证码生成和校验全部放到服务端,前端只拿图片和一次性令牌;服务端存令牌对应的答案,校验通过立刻删除;把提交接口单独用 curl 打一次,确认不带验证码会被拒。

改完照着核一遍,不带验证码或乱填的请求返回 400,源码里再也搜不到答案。

作者 9823189