短信验证码工作原理
我们的在注册各大网站或者APP的时候,经常会遇到填写验证码的情况。验证码的设置是平台为了验证用户身份而专门设置的安全机制。那么,问题来了:短信验证码在网络上的工作流程是怎样的呢?
短信验证码内部工作流程
1.使用random函数随机生成一个验证码,位数可以自己定(一般是4位、6位验证码)
2.调用短信运营商的接口,并向其发送手机号和验证码数据。
3.短信运营平台初步审核将信息发送给三大运营商的某一家。
4.运营商最终审核,将信息发送到用户手机上。(短信接口的参数一般包括:目标手机号,随机验证码(或包含失效时间),平台接口地址,平台口令等;)
5.网站或app保存接口返回的信息
6.服务器端会将这些信息保存在会话控制器Session中,作为后期的验证使用。
7.网站/APP接收用户填写的验证码信息
8.服务器端判断用户提交的验证码是否与储存在会话控制器Session中的信息一致,如果一致就通过;否则就验证失败。(也可以同时验证信息的失效时间)
============================================================================================================================
点击获取验证码时,倒计时,暂时设定倒计时的时间为180秒,
思路:
1,当点击【获取验证码】按钮时,发送请求到后台,根据自己的规则生成4位,6位或者8位数字,在用一个标识作为key,将随机数存到session中,我这里是用用户名作为key。
2,发送验证码成功之后,前端开始倒计时,当倒计时的时间 = 0时,发送请求到后端,将用户名作为参数传人,从用户名在session查找,得到发送验证码时保存到session中的随机数,然后从session中清除。
3,假如在倒计时中,用户已经输入了验证码,此时停止倒计时,将输入的验证码和用户名作为入参,传人后台,从session保存的验证码做比对,校验是否正确,
4,假如验证码正确,将倒计时框置为不可用,假如错误,停止倒计时,提示【验证码有误,请重新输入】。
5,验证码正确,提交表单时定义一个标识,可以提交表单。
===============================================================================================
现在市面上有多种验证码类型,例如图形验证码、滑动验证码、语音验证码、智力答题验证码等类型,短信验证码因其操作性简单,时效性强,安全性高,成本低等优点,短信验证码几乎成为了所有移动产品的标配。因此对短信验证码的机制进行分析,通过了解不同的短信验证码机制,我们可以更好地针对其来设计测试用例以及测试重点。现将目前市面上app的短信验证码机制做以下总结。
内容包含以下三个部分:
短信验证码相关机制
测试短信验证码的侧重点
总结
短信验证码相关机制
验证码获取机制
a. 不同业务场景的短信验证码
对于不同的业务场景,虽然发送短信验证码的接口是同一个,但是会区别不同的短信验证码发起类型而进行发送。常见的场景类似于注册、忘记密码、支付等,特别是涉及到用户个人敏感信息和资金时,为了确认用户本人操作时,通常会使用短信验证码进行二次认证。
b. 前后端校验:提交Token参数校验
前端(客户端)在请求发送短信的时候,同时向服务端提交一个Token参数,请求中不会将手机号等明文参数直接传给服务端。服务端对这个Token参数进行校验,校验通过之后,再向请求发送短信的接口向用户手机发送短信。流程图如下:
验证码时间&次数机制
以下时间和次数限制可以有效对单用户的短信轰炸和多用户的短信骚扰两种攻击场景进行防御。
a. 获取时间限制
从发送验证码开始,前端(客户端)会进行一个60秒的倒数,在这一分钟之内,在该页面,用户是无法提交多次发送信息的请求的。即使退出页面,重新再进入点击获取,会提示获取验证码频繁。
b. 次数限制-连续获取,但不校验
对使用同一个手机号在进行某些场景需要发送短信验证码操作时,连续获取验证码但不校验,系统可以对该手机号进行限制。达到设定次数提示超过上限,无法获取。但只能避免人工手动刷短信,对于批量使用不同手机号码来刷短信的机器无法进行限制。
c. 次数限制-连续获取,同时校验
对使用同一个手机号在一天内获取验证码,有个最大值的限制。
验证码错误机制
对于同一个手机号,如果连续提交错误的验证码,达到一定次数,会导致该手机号锁定一段时间,无法获取,也无法校验。
验证码超时机制
每次的短信验证码是有一定的时效性,超过一定的时间,校验时会提示该验证码已失效,需要重新获取。
验证码校验机制
目前短信验证码的校验分两部分,前端通常会先校验验证码的格式,位数等信息,服务端会对前端发送的内容进行校验。避免将短信验证码暴露在返回中,验证码只存在服务端中并不能通过任何api直接获取。
测试短信验证码的侧重点
短信验证码有些功能点由于测试环境无法测试,需要在生产环境着重验证的功能点;或者是其功能点在生产环境验证成本过高,可以放在测试环境先行验证。
短信验证码模板
由于测试环境不会真实发送短信到手机上,所以需要在生产环境上对短信的发送和短信模板进行测试。
短信验证码校验开关
目前在测试环境测试短信验证码时,由于不是真实发送短信验证码到手机号上,所以通常是方便测试,会将其校验关闭,即输入满足位数要求的验证码即可通过,或是输入固定的验证码便可通过。这便要求在生产环境需要着重关注是否有校验短信验证码。
若生产环境没有打开校验,不法分子便可以利用此漏洞使用任意手机号进行注册帐号而从中获利。
短信验证码次数&时间
在测试环境可以先对短信验证码次数和时间的阀值进行测试,避免在被恶意短信轰炸时,没有达到防御效果。
短信验证码场景
短信验证码在整个app中有不同的应用场景,需要对每个场景的短信验证码的校验进行测试,尤其涉及动帐类等场景。
总结
全面地了解验证码的机制,可以更好的帮助我们设计测试用例,抓住在测试环境及生产环境的侧重点,针对性地对短信验证码进行测试,避免不法分子利用短信接口的漏洞进行恶意攻击,给公司造成大量的金钱损失。