笔者开发多年,开发很多项目,登录是一个很常见的一个功能。也是一个很简单的、核心功能。但是就是这么一个简单的、核心的功能,却又很多人忽略了一个重要的点。那就是 验证码暴力破解。
普通验证码暴力破解
在账号密码登录时,为了防止穷举,通常会有一个图片验证码。我想每个开发者都知道这个道理。但是往往都会因为粗心,忽略一个很重要的环节,那就是验证码失效时间。
一般这个图片验证码3分钟有效。但是密码输入错误之后,没有对其进行刷新。也就是说,即使人工输入正确的验证码,在验证码有效的期间,可以进行无数次密码的提交实验。而且,就上图这种验证码,有太多的打码平台,购买套餐后,1毛钱就可以过掉。
这样,这种图片验证码就几乎没有任何意义,没有达到真正的防御效果。
短信验证码暴力破解
一般情况下,验证码会存在redis中,然后在验证的时候判断验证码是否正确即可。伪代码如下
public class Userservice{
//redis工具类
private RedisTemplate redisTemplate
//验证逻辑
public Boolean checkCode(String mobile,String code){
//获取缓存的验证码
String cacheCode = redisTemplate.getKey(mobile);
//对比验证码
if(cacheCode.eq(code)){
return true;
}else{
return false;
}
}
}
如上代码看似没有太大问题,验证了验证码是否正确,但是忽略了验证次数。
如果是一个4为验证码,5分钟内有效。按照上面的逻辑,也就是说5
分钟之内发送0000~9999
的请求,里面肯定有一个是正确的。