如何防止刷短信验证码?

news/2024/12/22 14:40:32/

问题:在前端使用云服务实现发送短信业务时,若未启用验证码防刷机制,会导致他人恶意或者无意刷新验证码,导致服务器压力变大,以及短信服务超额。

解决方案:采用redis存储短信验证码,在前端以及后端同时采用防刷机制,双重防刷,步骤如下;

前端:使用js代码检测上次点击的时间多久(如果刷新页面,会被重新清空,需要后端服务器读取redis中的数据确定发送时间)

<a id="sendCode">发送验证码</a>
//全局定义一个时间,这里设置成60s
var num = 60;
function timeoutChangeStyle(){//使用jQuery获取元素属性,设置成不可点击$("#sendCode").attr("class","disabled")if(num>0){var str = num+"s 后再次发送"$("#sendCode").text(str)//设置1s改变一次样式setTimeout("timeoutChangeStyle()",1000)	}else{num=60$("#sendCode").text("发送验证码")$("#sendCode").attr("class","")}num--;
}

后端:使用阿里云短信服务,操作api获取到验证码,在redis存储验证码时,加入前缀,来辨别验证码的来源,同时将验证码与记录时间合并,以“_”隔开,用于检测验证码是否超过60s。

具体步骤如下:

1)存储时,使用key-value键值对存储,这里对key与value分别做处理,使其具有防刷的特征;

2)存储key时,将手机号作为key,同时加上常量前缀,作为命名空间,格式:常量+手机号

3)存储value时,将验证码与存储的时间节点同时存储(这里用UUID模仿阿里云服务的验证码),然后以“_”符号隔开,格式:验证码 + “_” + 时间节点

    @ResponseBody@GetMapping("/sms/sendcode")public R sendCode(@RequestParam("phone") String phone){//接口防刷String redisCode = redisTemplate.opsForValue().get("LOGINCONSTANT" + phone);if(!StringUtils.isEmpty(redisCode)){long l = Long.parseLong(redisCode.split("_")[1]);if(System.currentTimeMillis()-l < 60000){return R.error("10002", "短信验证码频率太高,稍后再试");}}//用UUID模仿云服务传来的验证码String code = UUID.randomUUID().toString().substring(0, 5);//格式:验证码 + “_” + 时间节点String codeWithTime = code + "_" + System.currentTimeMillis();redisTemplate.opsForValue().set("LOGINCONSTANT" + phone,codeRedis,10, TimeUnit.MINUTES);return R.ok();}

如何检测验证码是否有60s?

存储在redis的数据里的结构是 常量+手机号(key)-验证码 + “_” + 时间节点(value) ,当前端点击发送验证码按钮时:

1)先从redis中检测该手机号是否存储相应的验证码,若不存在,就按上面格式存储一份验证码。

2)若存在,按照存储的key取出相应的值,用split方法将验证码与时间戳分隔开,将存储的时间戳与当前时间做减法,若未超过60s,前端返回相应提示信息,提醒用户时间未到。


http://www.ppmy.cn/news/711979.html

相关文章

登录之手机号验证码登录

今天测试云之讯api 云之讯官网提供源码只需要修改就好 我的是放入tp5路径如下&#xff1a;前端代码脑补 只有一个input和按钮 直接上代码 index.php <?php namespace app\admin\controller; use think\Db; use think\Loader; use think\Controller; use app\admin\contr…

手机发送验证码

1 需求 发送短信以后&#xff0c;再次发送短信按钮变得不可用&#xff0c;倒计时60秒以后才可以使用 2 步骤 创建按钮倒计时的方法&#xff1a;function countDown(count)&#xff0c;在发送短信请求以后调用 发送短信按钮不可用 每过1秒调用1次匿名函数 匿名函数中计数减1…

某注册页面存在手机短信验证码绕过

某注册页面存在手机短信验证码绕过的情况 关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭关闭…

手机号+短信验证码登录注意

首先我们 说下成员变量和局部变量 简单介绍下 成员变量 &#xff1a;定义在class里面 方法外边 局部变量&#xff1a; 定义在方法里面 如果一个变量是成员变量&#xff0c;那么多个线程对同一个对象的成员变量进行操作时&#xff0c;它们对该成员变量是彼此影响的&#xff0c…

往手机发验证码

前段时间因为项目的需要涉及到了一个往手机上发验证码的项目&#xff0c;代码贴出来&#xff0c;希望指点。。。。。 首先是页面&#xff0c;此页面是用于输入用户的手机号码&#xff1a;addModeCode.jsp <% page contentType"text/html; charsetgb2312" %> &…

城市一账通收不到注册短信或者手机收不到短信

每个人手里都是有手机&#xff0c;有很多的app的注册、登录都是用手机号&#xff0c;因为这样更方便&#xff0c;不需要实时记录个人密码&#xff0c;特别是针对自己设置很多密码&#xff0c;容易忘记&#xff0c;只需要收到验证码即可授权登录&#xff0c;但是有一定的风险吧&…

手机验证码获取

<el-form-item label"短信验证码" required><el-input v-model"ruleForm.verificationcode" placeholder"请添加验证码"><el-button v-if"isdisabled" slot"suffix" style"color:#409EFF;" type&…

短信验证码泄露怎么办?

短信验证码泄露看起来不是啥大事&#xff0c;但是如果真的被别人恶意窃取了就不是个小事了&#xff0c;轻则账号丢失&#xff0c;重则账户中的钱财不保&#xff0c;所以对验证码大家一定要加强保护&#xff0c;不要被有心人窃取了。 那么&#xff0c;短信验证码为什么会泄露&a…