登陆验证码 validation 校验方法

less than 1 minute read

明文验证码

最近处理一个管理系统登陆功能, 测试人员通过抓包工具检测到登陆的验证码存在漏洞. 起初, 前端发起一个验证码请求接口, 这个验证码请求接口收到 base64 编码字节流的返回数据, 当前端拿到 base64 直接展示出来, 那么这个 http 请求是不合理的, 因为没有对这个验证码请求设置 cookie 标识谁发起的请求.

有权限验证码

于是对上次的验证码请求接口加上了 cookie 头部标识, 在登陆时, 输入账号和密码以及验证码之后, 如果输入账号密码或者验证码错误, 就提示用户重新输入, 并重新发起验证码请求进行更换验证码, 于是打包更新到测试环境, 测试人员测试还是存在漏洞. 分析之后是因为登录请求时后台处理逻辑不正确, 后端先判断账号和密码是否输入正确, 最后再校验验证码, 结果每次输入错误验证码都会发起登陆请求接口.

验证码失效时间

并且上一次的验证码是否失效未做处理, 所以后面在每次更换验证码时, 给上一次验证码加上失效时间, 防止用户输入上一次的验证码进行请求.

正确校验证码

所以在有效期内, 为了防止用户输入上一次的验证码, 先进行验证码的校验, 等验证码校验之后再进行校验用户名和密码. 那么做到验证码唯一性比较重要, 所以前端在发起验证码请求时, 通过传一个时间戳+随机数, 后端通过这个时间戳+随机数再加密生成一个 base64 验证码返回给前端, 这样就能保证登陆时的安全性.