短信验证码可以验证手机号的有效性,短信验证应用的地方越来越多,写这篇博文的原因是因为我司最近弄了个H5活动,有个发送短信验证码的功能由于java组没做防刷机制导致短信被刷。而他们的解决办法令我匪夷所思,因为根本起不到作用。所以想写一篇关于防刷的博文。
短信被刷也算网络攻击的一种,网络攻防一直是相爱相杀的存在。没有绝对的防御,只有不断增强防御,提高攻击者的攻击成本,使其攻击成本高于收益,从而放弃攻击。
短信防刷也是同样的道理,就是不断的增加攻击者的攻击成本。攻击者一般会尝试使用不同的攻击方式进行试探性攻击,根据反馈回来的信息做进一步分析,完善攻击方式,从而进行有效攻击。 所以对于明显属于攻击的行为,尽量不要给出明确的错误提示是非常重要的(业务逻辑错误的提示除外)。 这样,攻击者就不能很快的判断到底是什么地方验证没通过,从而增加攻击者攻击成本。
下面给出详细的放刷思路:
第一步,验证请求方式
一般网页发送验证码是通过ajax发送post请求,所以可验证是否是ajax请求、post请求。而APP、小程序等一般发送post请求接口,可验证是否是post请求。如果出现这类错误,基本是非法攻击行为,不要给出明确的错误提示,给出诸如“系统错误”之类的模糊提示。但,请求方式是可以伪造的,这种判断只能过滤小白攻击者,还需后续验证
第二步,分析请求头中的Referer
一般情况下,用户先进入页面输入手机号然后点击发送验证码,所以可以根据请求头中的Referer来