短信API接口在web中获得愈来愈多的应用,如用户注册,登陆,密码重置等业务模块都会使用手机验证码进行身份验证。通常状况下,咱们会采用这样的安全策略,将短信发送频率限制在正常的业务流控范围内,好比,一个手机号一天最多下发10条短信,同时限制时效,验证次数。但这样的策略,攻击者经过遍历手机号,仍是阻止不了短信资源被消耗的状况。前端
如何防止短信api接口遍历呢?web
在平时浏览网站的时候,我会稍微留意一些网站是怎么作的,并记录了一些短信API接口防遍历的技术实现方式。ajax
第一种方式:白名单算法
这是最简单的一种方式,但应用场景有限,好比,在一些内部应用系统(从HR系统或其余系统同步手机号过来验证),此时,只须要验证是否为内部员工手机号,如不是,直接提示非内部员工手机号;如是,再执行短信api流控策略。api
第二种方式:验证码(推荐)安全
用户点击获取短信验证码的时候,弹出图形验证码进行验证,同时发送图形验证码和手机号码到后台验证。post
固然,这种方式用户体验极差,每次都须要手动须要图片验证码才能发送手机验证码,因而,有了进一步的优化方案,从用户体验和安全角度出发,可设计为当用户输入3次错误手机验证码后自动弹出验证码。优化
还有另一种方式,采用当下比较流行的滑块验证或点选验证方式,用户体验也会有所改善。网站
第三种方式:接口加密(不推荐)ui
前端与后台协商好加密方式,好比md5(timestamp+telphone+salt),前台发起请求时,同时发送 timestamp、telephone、sign参数,后台接收这些参数,按照协商好的加密方式生成一个校验值与sign进行对比,若是错误,则不处理。另外,js代码混淆+短信api业务流控限制。
风险点:虽然作了代码混淆,但js加密算法一旦泄漏,并非一种安全的措施,但也是一种比较容易实现的技术方案。
客户端ajax代码实现:
var timestamp = (new Date).getTime(); var sign = md5(timestamp+telephone+"qwertyuiopasdfghjkl"); ajax.post({ 'url': '/sms_captcha/', 'data':{ 'telephone': telephone, 'timestamp': timestamp, 'sign': sign }, ...........
以上,是三种常见的预防短信api接口遍历的技术实现方案。
我建立了一个免费的知识星球,主要用于技术问题探讨。我将这个问题发表在知识星球,获得了很多星友的热情回应,如下摘录一些星友们的见解。
@超人:限制ip有可能误伤同一局域网下的用户,最好是登录后容许发送,限制用户的发送次数
@密因:同一手机号,60秒内不能重复发送,24小时内总共发送不超过5次;2个及以上手机号,经过识别客户端特征,出口ip,随机字符串,断定是否为同一用户,对同一用户使用限制措施。或者设定略高于日常请求数的基线,如平常1分钟100个短信请求,基线设置为150,1分钟内超过150次以外的请求丢弃。
@Antares:限制每一个IP、账号天天的请求频率和数量,对请求参数作签名校验,防止请求重放
@Adler:在获取验证码前加验证,而后黑名单屏蔽虚拟号,限制每一个IP必定时间内的请求数和限制每一个手机号请求的总次数。
@yd:通常都是限制ip在时间段内请求次数,限制同一手机号发送次数,加图形或滑动等验证码。
@Mr.周:设置请求上线 屏蔽虚拟号码段。
@ch4ce:咱们限制了IP地址,虽然这样不是最好的解决方案。
@Loki⚡:我我的感受,首先确保发送短信验证码的逻辑是正确的,而后能够根据业务的重要程度决定是用安全产品,仍是本身开发人机识别功能。
1024:人机验证,设备号,帆布指纹, ip。
corp0ra1:若是能够的话,匹配用户名?
掉到鱼缸里的猫:限制同IP请求次数。
zxt:每一个用户一天或者一个小时只容许三个验证码,同ip天天只容许三个用户获取验证码。这种模式比较经常使用。
这是一个免费的星球,诚邀你的加入!