防止短信验证码被刷可以采取以下几种措施:
1、图形验证码限制:图形验证通过后再请求接口
图形验证码限制是最常用的一种方式,用户输入图形验证码并通过之后,再请求短信接口获取验证码。
2、时间限制:60秒后才能再次发送
这种措施使用得比较普遍,从发送验证码开始,前端(客户端)会进行一个60秒的倒数,在这一分钟之内,用户是无法提交多次发送信息的请求的。但是却不是非常有用,技术稍微好点的人完全可以绕过这个限制,直接发送短信验证码。
3、手机号限制:同一个手机号,24小时之内不能够超过5条
对使用同一个手机号码进行注册或者其他发送短信验证码的操作的时候,系统可以对这个手机号码进行限制,例如,24小时只能发送5条短信验证码,超出限制则进行报错(如:系统繁忙,请稍后再试)。然而,这也只能够避免人工手动刷短信而已,对于批量使用不同手机号码来刷短信的机器,这种方法也是无可奈何的。
注意:
1:图形验证码验证逻辑放后台处理,禁止图形验证码返回前端,防止利用第三方软件截取图形验证码。
2:时间限制60秒发送一次,发送后手机和验证码绑定存入域中,输入验证一次手机号,立马把验证码失效,防止多次尝试爆破验证码,
3:同一手机号,发送过短信,对手机号正则判断,
a.发送一次验证码可以用三次,
手机号与验证码相同时,3分钟内最多使用3次控制。
只能使用次数做判断,放入域中,手机号和验证码作为key,使用次数作为value,使用一次,value加1,每次验证大于3时,拒绝使用。(key不存在时第一次验证存1,key存在时,value+1);
b.手机号与验证码绑定验证,防止a利用b的验证码
1:验证码发送成功后,域存key为手机号,value为验证码,
2::验证时,用输入的手机号获取的验证码与页面传入的验证码比较,且不为空
c.1分钟内重复发送验证码控制。
1:验证码发送成功后,记录发送时间与结束时间 当前时间,推迟1分钟为结束时间。结束时间存入域中。
2:再次发送时判断域中结束时间是否为null,为null则发送,否侧获取当前时间,与结束时间判断,小于结束时间并且大于发送时间(结束时间减1)则也不发送
d.发送短信之前,图形验证码校验
1:生成图形验证码后,存入域中。
2:验证图形验证码,并且不为空。
e.24小时发送5次限制
只能使用次数做判断,放入域中,用户id作为key,使用次数作为value,使用一次,value加1,每次验证大于5时,拒绝使用。(key不存在时第一次验证存1,key存在时,value+1);
f.验证成功后直接进行下一步操作,避免被劫持修改状态进行后续操作,短信验证被绕过。
验证完直接操作,避免特权码,或者万能码存在