security-验证码业务新设计
- 不合理的验证码业务逻辑设计,导致验证码存在安全风险,用户密码存在可爆破风险 *
现有业务设计:
- nodejs 环境,引入 svg-captcha, 后端生成验证码
- 验证码图片通过 api 返回,同时验证码文本通过 set-cookie 设置到浏览器,验证码有效期 30s
- 前端在登录时,需要在参数中用户输入验证码内容,以及请求头中携带包含验证码文本的 cookie
- 后端在登录时,需要校验验证码文本是否与 cookie 中的文本一致
问题
验证码复用,导致用户名密码可爆破
- 调用登录接口时,需要在参数中携带用户名、密码、验证码
- 使用相同验证码遍历用户名,返回包均相同,证明验证码存在复用
- 验证码存在复用风险,攻击者可以通过遍历用户名,使用相同验证码登录,获取用户密码
解决方法
- 规则:每个验证码只允许使用一次
- 验证码生成后,同时生成一个 captchaId, 作为验证码的唯一标识,唯一标识作为 key、验证码文本作为 value 存储在 redis 中,有效期与验证码有效期一致
- captchaId 过期后 redis 回自动删除,不会占用内容
- captchaId 通过 set-cookie 设置到浏览器
- 登录时,校验验证码文本是否与 redis 中的 captchaId 一致,如果不一致,则返回验证码错误,一致和不一致的情况都删除 redis 中 captchaId