从简单的功能探寻背后的技术。前端
昨天看到一个地址,新用户免费领取X登读书APP的14天会员,2020年了,要开始读书了。看到这个活动是在笔记本上,因而用笔记本浏览器访问活动页面,输入手机号,收到验证码,填写验证码,领取这个会员。原本觉得一切就是这样顺利的结束了,然而并非,填写验证就提示“网络错误”。这不科学啊,做为程序员,我下意识的按了一下F12,打开了开发者工具
,因而看到了下面的错误,如图:程序员
将错误单独截图出来:数据库
简单一点就是出现了跨域的问题。我想了一下,那估计这个活动是针对移动端的,我用PC端访问致使出现跨域。这个地方设计很差。跨域
因而用手机去访问活动页地址,正常打开,而后填写手机号,而后提示:浏览器
我刚才PC发了几回验证码,这个地方设计仍是考虑到安全性了,不错。缓存
我只能等待,在开发角度,这个就是在一个固定的时间周期内,个人手机号只能发固定次数的验证码,超过这个数量,就不会给我在发了,一个是安全考虑,另外一个可能也是费用考虑( 防止短信验证码被刷 )。安全
过了一段时间,我在去手机端试着领取,发现一切顺利,领取成功。网络
看到这里的伙伴若是是新用户,也对读书有点兴趣,那能够领取这个会员体验一下。地址:t.cn/AiFfyICx工具
到这里本该就结束了,可是做为一个开发人员,我以为要简单整理一下这个发短息的功能,由于这个功能虽然看似简单,里面深究起来也有不少地方须要注意以及考虑的。设计
互联网的时代,发送短信验证码已经做为不少产品中必不可少的一个功能。用于的场景也是不少,如注册登陆、银行转帐、营销活动等(真的有不少场景,我就很少举例了)。
那在发送验证的时候,其实不少公司用的都是第三方的短信服务,这个短信的服务是须要收费的,天下没有免费的午饭。那么就出现 刷短信的黑工具——短信轰炸机 。
短信轰炸机就是一个利用写好的程序来大批量刷短信的软件,它可以经过自动批量提交手机号、模拟IP等方式去刷短信。
若是 须要用到短信验证码的产品的时候,必定要制定限制规则 ,作好设计。
主要原则:发送验证码是前端和后台是须要共同设计的,这样相对才能更加完善或者更加完美。 主要思路:
xx秒后才能再次发送
通常点击验证后,在前端(客户端)会进行一个xx秒的倒数(这个倒计时能够根据具体产品具体业务定,不少是60s)。在这固定的时间内,用户是没法提交屡次发送信息的请求的。
具体时效限制要考虑产品自己属性,操做难易度,网络延迟,短信资费成本等。
(1)、在须要发送验证的码的时候,先让用户输入验证码,当输入的验证码经过后,才能请求获取短信验证码,不然获取验证按钮不激活。 (2)、在请求获取验证后,通常在前端(客户端)会进行一个xx秒的倒数(这个倒计时能够根据具体产品具体业务定)。在这固定的时间内,用户是没法提交屡次发送信息的请求的。
这一点,图形验证码不必定是必须的。可能为了有更好的用户体验,一开始不须要输入图形验证码,在操做达到必定量以后,才须要输入图形验证码。具体状况请根据具体场景来进行设计。
这种方法虽然使用得比较广泛,可是却不是很是有用,技术稍微好点的人彻底能够绕过这个限制,直接发送短信验证码。 若是前台倒计时60s,后台验证码的失效时间设计确定不能是60,通常会是5~10分钟。
同一个手机号,指定时间以内不可以超过x条。
对使用同一个手机号码进行注册或者其余发送短信验证码的操做的时候,系统能够对这个手机号码进行限制,例如,24小时只能发送5条短信验证码,超出限制则进行报错(如:系统繁忙,请稍后再试)。然而,这也只可以避免人工手动刷短信而已,对于批量使用不一样手机号码来刷短信的机器,这种方法也是迫不得已的。
限制相同的IP/Cookie信息最大数量
使用Cookie或者IP,可以简单识别同一个用户,而后对相同的用户进行限制(如:xx时间内最多只可以发送xx条短信)。然而,Cookie可以清理、IP可以模拟,并且IP还会出现局域网相同IP的状况,所以,在使用此方法的时候,应该根据具体状况来思考。
这样在第三点的基础上防止恶意刷手机验证码短信,若是同一个ip屡次请求获取手机验证码短信,由于短信须要钱,竞争对手极可能恶意刷去。(咱们对他人心怀善意,可是心里要有防备之心)
监控短信服务,作好出问题以后的防御
以上的方法并不必定可以彻底杜绝短信被刷,所以,咱们也应该作好短信的预警机制,即当短信的使用量达到必定量以后,向管理员发送预警信息,管理员能够马上对短信的接口状况进行监控和防御。
当我整理了相关的资料后,稍微明白了今天上文出现的问题,移动端验证码正常验证,而PC端不能进行验证的缘由。多是产品设计上的限制恶意刷短信,作了跨域请求限制。 也或许这就是一个bug。
一个看似简单的功能,要简单作能够很简单,要复杂也能够很复杂,做为一个技术人员,了解业务,了解使用场景,了解用户量等,全面考虑,多端的时代,兼容性等也要考虑。
其实这个问题若是能够仔细想清楚的话,若是之后遇到就可以全面考虑,而且开发人员老是说本身作增删查改,这个的功能设计好,里面涉及了增删查改,更涉及了一个开发对功能的设计能力。
作好每个小的功能,从小的地方提高用户体验,是产品和开发共同的责任。
最后在说两点,看到的朋友思考下:
一、后台应该如何处理验证码,保存在什么地方,内存,缓存,仍是数据库?
二、怎么样的短信验证码用户体验好,内容和验证码长度?
欢迎留言,一块儿探讨交流~
手机验证码很重要,请不要泄露给陌生人~