10.1.1 验证码绕过
图片验证码是目前见得比较多的,图片验证码形式也比较多,有中文、英文、字母数字和看图识物等等,简单列举一下,如图10.1到图10.3所示。
图10.1 图形验证码
图10.2 手机号验证
图10.3 稍微复杂一点的图形验证码
一些验证码为了避免机器识别,被设计得让人难以辨认,用户体验与安全是有一点矛盾的,从业务角度考虑,我们还是能找到很多绕过这些验证码的方法,我们来一起看看。
(1)不刷新直接绕过
Web页面登录等操作的验证码能够多次使用的原因是后端程序在接收一次请求后,并没有主动刷新验证码,部分比较大的业务使用了负载均衡,验证码跟Session绑定在一起,为了能够保证验证码能够正常使用,所以会把验证码明文或者加密后放在Cookie或者POST数据包里面,所以每次只要同一个数据包里面的两个验证码对上了即可绕过。
(2)暴力破解
注册或者找回密码等敏感操作时的手机或者邮箱验证码能够爆破,主要是因为程序没有设置验证码错误次数和超时,导致能够不断进行尝试。
(3)机器识别
机器识别验证码对于不同的验证码类型有不同的手段,最常见的是图片验证码的机器识别,这类识别有两种情况:一种是针对不是实时生成的验证码,已经生成了部分的验证
码在服务器端保存,前端直接加载验证。这类是最好绕过的,只要把全部的验证码文件保存回来,做一个图片MD5库,然后利用的时候直接匹配服务器端返回的图片MD5即可识别。另外一种是动态生成的验证码,这类需要做一些图片文字识别或者语音识别,。
(4)打码平台
这类打码平台大多数后端是使用廉价的人工资源在打,国内比较有名的有打码兔、Q赚等等。
经过上面的分析,我们大致可以知道怎样设计一个强壮的验证码,主要有以下几点:
➢最重要的是,要设置验证码错误次数,比如一个验证码只能错误一次,这就避免了暴力破解的问题。
➢不把验证码放到HTML页面或者Cookie中。
➢验证码要设置只能请求一次,请求一次后不管错误与否都在后端程序强制刷新。
➢短信或者邮件验证码必须要6位以上字母和数字混合,图片或者语音验证码需要加强混淆干扰,比如图片文字变形,增加干扰斑点等。语音验证码增加背景噪声。
➢验证码要动态生成,不能统一生成多次调用。