如何防止验证码被攻击?验证码可以用来攻击单个用户,也就是短信轰炸,也可以刷量增加网站成本,虽然一条几分钱,但是量多了也是一种成本。以下几种验证码被攻击的解决方案。
1.发送间隔限制,每过60秒或120秒之后才可以再次发送
这个可以在前端限制点击之后60秒内无法再次触发事件。当然了后台也需要限制,
每次发送成功后,可以在redis里存储一个字符串,key为手机号,value带有时间戳。同一个手机号再次发送时先从redis里获取字符串对比时间。
另外,这个字符串的过时时间也可用作验证码的有效时间,例如验证码5分钟之内有效,那么字符串的有效时间就可以设置为5分钟。
2.发送次数限制,每天只可以发送多少次
可以在redis内维护一条记录,记录的过期时间为24小时,value为此号码发送短信的次数,每次发送前先获取此号码今天发送了多少次了,超过次数不发送。
3.同一个ip发送次数限制
这个做法和方法2类似,只不过把(号码, 次数)换成了(ip,次数)。
4.增加图片(或其他形式)的验证码
每次初始化时随机生成一个图片验证码存在session,在最后点击发送之前需要验证输入的验证码是否正确,验证码使用一次后失效。
5.增加token
用户提交请求时会携带token到后台,将缓存中的token和用户请求带过来的token进行比较,如果相同,会将缓存中的token进行更新。若用户重复提交,则用户之后发过来的请求的token和缓存中的token是不一致的,所以会导致之后的请求失败。
==============================================================================================
短信验证码接口攻击(短信轰炸)原理分析
==============================================================================================
短信验证码接口非常容易遭受互联网恶意攻击——“短信轰炸”,该攻击通过循环利用不同业务中的无需注册即可向任意手机号发送短信验证码的正常业务需求(如用户注册、密码修改等),向多个手机号码同时连续发送大量的验证短信,对用户造成困扰。下面对短信轰炸的原理进行具体分析,进而制定相应的安全防护方案。
短信轰炸原理
短信轰炸一般基于 WEB 方式,其由两个模块组成,包括:一个前端 Web 网页,提供输入被攻击者手机号码的输入窗口;一个后台攻击页面(如 PHP),利用从各个网站上找到的短信验证码 URL 和前端输入的被攻击者手机号码,发送 HTTP 请求,每次请求给用户发送一条短信验证码。利用这两个模块实施“短信轰炸”攻击,原理具体分析如下:
- 恶意攻击者在前端页面(下图所示 )中输入被攻击者的手机号;
- 短信轰炸后台服务器,将该手机号与互联网收集的可不需要经过认证即可发送短信的 URL 进行组合,形成可发送验证码短信的 URL 请求;
- 通过后台请求页面,伪造用户的请求发给不同的业务服务器;
- 业务服务器收到该请求后,发送短信验证码到被攻击用户的手机上。
这个过程如下图 所示。
短信轰炸实例分析
用户在某短信轰炸软件上输入被攻击手机号、攻击的次数后,对被攻击的手机号进行攻击的源码如下图所示。
该攻击页面中主要采用 img src="’http://…..’" / 来调用业务服务器短信发送的接口。如上图红框中内容所示:
- 在“短信轰炸”源代码中,利用img标签的 src 属性定义了可以请求发送验证码短信的 URL(如 gd.12530.com/….);
- 在其中的 phonenumber 字段中嵌入被攻击的手机号(如 13811111111)后,即可形成攻击 URL;
- 页面运行后,将其以 HTTP GET/POST 的方法提交给业务服务器;
- 业务服务器发送短信验证码到被攻击者的手机上,从而完成了短信轰炸。