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

解决方案:采用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,前端返回相应提示信息,提醒用户时间未到。

如何防止刷短信验证码?相关推荐

  1. 注册刷短信验证码的问题

    2019独角兽企业重金招聘Python工程师标准>>> 由于目前的项目是比较老旧的PHP代码,而且没有用到开放的一些PHP开发框架,全都是最基础的代码码起来的. 最近遇到有在刷注册的 ...

  2. java 防止恶意刷短信验证码_用户使用java短信验证码时要做好三个保护

    java短信验证码的出现,对企业来说,是减少了运营费.人工费.操作费,带来了方便也带了利益:对于广大用户朋友来说,它也保护了个人的信息安全,确保了自己网上支付时没有威胁风险.但是有些朋友对于java短 ...

  3. 产品防护:5种常见的短信验证码防刷策略

    短信验证码作为重要的身份验证工具,因其操作简便.安全性高.时效性强等优点已被开发人员广泛使用.但因其获取便利.限制较少容易被不法分子利用进行短信轰炸,恶意刷掉大量短信费用,给公司或个人造成大量的金钱损 ...

  4. 如何防止短信验证码接口、登录注册入口被恶意调用攻击?

    目录 前言 1.短信验证码是什么? 2.为什么要对短信验证码进行防护? 3.有哪些常见的防护手段? 4.这些防护手段有没有用呢,到底该如何选择? 5.结语 前言 最近遇到一个关于防止短信验证码被刷的问 ...

  5. 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全

    创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 创宇滤镜|API防刷|短信邮件接口防刷|验证码防刷|搜索防刷 - 知道创宇云安全 posted on 2017-02- ...

  6. 短信验证码/邮箱验证码的发送及防刷校验

    一.发送短信验证码及接口防刷 1.前台注册或登录页面调用的后端接口(防刷,并利用openfeign调用另一个服务发短信): @ResponseBody@GetMapping("/sms/se ...

  7. 短信验证码+token唯一机制+防止重刷+幂等性

    点击阅读认证服务 阿里云服务 下面截图为阿里云提供的 发送手机短信验证码的服务代码 将蓝色标记变成可配置的 怎么做?? 一个文件要是想可配置 就是从配置文件中取 首先当前的函数要和配置文件关联上 你要 ...

  8. java实现发送短信验证码、短信验证码防刷校验-49

    一:认证服务环境搭建 1.新建gulimail-auth-server 2.整合相关依赖 <!--引入commom依赖--><dependency><groupId> ...

  9. 程序员放大招教你网站怎么做短信验证码防刷验证码机制-速码云

    文章来源:http://www.4006026717.com 在我们开始发送了 短信验证码 的时候在前台中会出现一分钟的倒计时,进行了这个操作了之后,在这段时间之内,如果用户多次提交的话是无法发送请求 ...

最新文章

  1. 基于鲁棒图进行概念架构设计
  2. 网络推广专员教大家网站SEO优化中锚文本的使用技巧
  3. 成功解决ModuleNotFoundError: No module named 'keras_retinanet'
  4. POJ - 2115 C Looooops(扩展欧几里得)
  5. PHP专题-开发基础(七)
  6. 【C++基础】模板参数与模板继承
  7. jeecg 根据数据类型key查询数据字典
  8. java mac pos_pos终端mac国密(sm4)算法(java实现)
  9. bzoj 3123 [Sdoi2013]森林
  10. ✿ iBm T60 水货入手了 满意 2005
  11. 【黑马Java笔记+踩坑汇总】JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城
  12. shell编程-数组的使用
  13. 1788 数量的类模板
  14. Android10源码下载与编译(Mac移动硬盘)
  15. 6-1 判断一个点是否在一个圆的内部 (20 分)
  16. 向UBOOT 中添加自己的板子
  17. rosbag 详细使用
  18. Revit API: DWG翻模的基本原理
  19. Linux终止程序快捷键
  20. bat文件修改文件内容

热门文章

  1. 从单张图重建三维人体模型综述(三)
  2. 996,拖延症,无效社交,不会休息:低效能人士的七个习惯!
  3. 计算机网络怎么提升,如何提高电脑网速
  4. gazebo如何加载sdf文件的模型
  5. 陈天桥简介(盛大CEO)
  6. 服务器系统ghost蓝屏,win7系统ghost安装一半蓝屏的解决方法
  7. 'gbk' codec can't decode byte ... 的解决办法
  8. 牛客竞赛每日俩题 - Day1
  9. Unity shader新手入门教程:实现汽车氮气加速特效
  10. 火车票软件哪个好用_抢火车票软件哪个好用?