大部分产品都会涉及到短信验证码的使用界面,尤其是手机产品,短信验证码几乎已经成为所有手机产品的标准。因此,防止短信被刷成了每个产品经理和开发人员关心的问题。

没有体验过短信被刷问题的产品经理可能不会太注意这个问题。在这篇文章中,我将简要介绍黑色工具的短信轰炸机。短信轰炸机是一个软件,使用书面程序刷短信大量。它可以自动批量提交手机号码,模拟IP等方式刷短信。

因此,在设计需要使用短信验证码的产品时,必须制定限制规则,避免短信被闪现。

在PC时代,大多数平台通过图形验证码的形式降低了被机器刷过的风险。最典型的例子是12306“奇妙的验证码”。然而,在移动互联网时代,用户体验非常重要,有时使用图形验证码会对用户体验产生一定的影响。那么,除了图形验证码的方式外,还有什么方法可以解决短信被刷的问题呢?

提供了几种方案仅供参考:思路都在,代码就容易实现咯

1、时间限制:60秒后才能再次发送

从发送验证码开始,前端(客户端)将执行60秒的倒计时。在这一分钟之内,用户无法提交多个发送信息的请求。尽管通常使用此方法,但它不是很有用。技术更好的人可以绕过此限制,直接发送短信验证码。
代码如下:

//检查是否相隔60秒后发送
$limitKey = "mobile_sms_send_limit:" . $mobile;
$smsSendLimit = Yii::app()->redis->get($limitKey);
if ($smsSendLimit) {$this->_end(1, '60秒后才能重新发送短信验证码!');
}

2、手机号限制:同一个手机号,24小时之内不能够超过5条

使用相同的手机号码注册或发送SMS验证码的其他操作时,系统可以限制手机号码。 例如,在24小时内只能发送5个短信验证码。 如果超出限制,则会报告错误(例如:忙,请稍后再试)。但是,这只能避免手动刷短信。 对于使用不同手机号码批量发送短信的计算机,此方法无助。
代码如下:

//检查发送次数
$key = "mobile_sms_send_times:" . $mobile . ":" . date("YmdHis");
$smsSendTimes = Yii::app()->redis->get($key);
if (empty($smsSendTimes)) {$smsSendTimes = 0;
} else if ($smsSendTimes >= 5) {$this->_end(1, '每个手机号每天最多能发5条短信!');
}

3、短信验证码限制:30分钟之内发送同一个验证码

网上还有另一种方法:30分钟内,发送的所有短信验证码都是相同的验证码。第一次请求SMS界面,然后缓存短信验证码结果。如果您在30分钟内再次请求,您将直接返回缓存的内容。对于此方法,尚不清楚短信接口提供程序是否会为发送缓存的信息收取费用。如果您有兴趣,可以了解一下。
部分代码如下:

<?php
//这里判断是否存在短信缓存
if(Cache::get('codeCache') != null){//短信30分钟内存在,则继续发同一条短信给用户$code = Cache::get('codeCache');//接下来把code发给用户的业务操作。。。}else{//接收短信验证码$code = $this->smsTplTrait()  //假如这里作为接收到短信"562334"//将接收到的code存在Cache里30分钟Cache::put('codeCache', $code, 30);
}
?>
 

4、前后端校验:提交Token参数校验

这种方式比较少人说到,个人觉得可以这种方法值得一试。前端(客户端)在请求发送短信的时候,同时向服务端提交一个Token参数,服务端对这个Token参数进行校验,校验通过之后,再向请求发送短信的接口向用户手机发送短信。

5、唯一性限制:微信产品,限制同一个微信ID用户的请求数量

如果是微信的产品的话,可以通过微信ID来进行识别,然后对同一个微信ID的用户限制,24小时之内最多只能够发送10条短信。

6、产品流程限制:分步骤进行

例如,在注册的短信验证码使用情况下,我们将注册步骤分为两个步骤。 用户输入手机号码并设置密码后,下一步是进入验证码验证步骤。

7、图形验证码限制:图形验证通过后再请求接口
图形验证码前后台交互流程比较简单,主要分为以下三步:

1) 客户端请求到页面的同时,向服务端发起请求,服务端生成验证码将验证码字符,存入到session中以备客户端的校验。与此同时,服务端将生成的验证码图形给到前端;
2) 前端获取到验证码图形,渲染展示到页面。用户识别图形验证码后,提交验证码的字符到服务端;
3) 服务端接收到验证码校验的请求,将接收到的字符与session中存储的验证码字符进行比对,并将比对结果返回到前端。

前端部分代码

<p class="form-group col-lg-6"> <label for="id" class="col-sm-4 control-label"> 验证码: </label> <p class="col-sm-8"> <input type="text" id="code" name="code" class="form-control" style="width:250px;" /> <img id="imgObj" alt="验证码" src="/article/getValidateCode" οnclick="changeImg()" /> <a href="#" οnclick="changeImg()">换一张</a>
</p>
 
后端部分代码
<?php
/**
* 这里是判断获取的code与存在session的code是否一致,一致则进入下一步,发短信验证码
* 1 首先要处理的是前端要获取从后端响应过去的code,所以php后端要有生成验证码的代码,生成session,并且响应给前端用
* 2 前端获取到code后与session做比较
*/public function checkCode(Request $request)
{$code = $request->input('code');if($code == SESSION['getCode']){//这里就是通过验证码后,接下来发送短信的业务逻辑,根据自己的业务需要把$consignee_content = $this->smsTplTrait('consignee_order', 1);  //查找短信模板$consignee_content = sprintf($consignee_content);$this->sendSmsTrait($consignee_content, '', 1);  //发送短信}else{response(['status'=>'0' ,'message' => '验证码有误,无法发送短信']);}
}?>
 

8、IP及Cookie限制:限制相同的IP/Cookie信息最大数量

使用Cookie或IP,您可以轻松识别同一用户,然后限制同一用户(例如,您最多只能在24小时内发送20条短信)。 但是,可以清理Cookie,可以模拟IP,并且IP在局域网中也可以具有相同的IP。 因此,使用此方法时,应考虑具体情况。
代码如下:

//检查IP发送次数
$keyIp = "mobileIp_sms_send_times:" . PublicFunHelper::getIP() . ":" . date("YmdHis");
$smsIpSendTimes = Yii::app()->redis->get($keyIp);
if (empty($smsIpSendTimes)) {$smsIpSendTimes = 0;
} else if ($smsIpSendTimes >= 20) {$this->_end(1, '您获取短信验证过于频繁,请稍后再试!');
}
 

9、短信预警机制,做好出问题之后的防护

以上的方法可能无法完全防止短信被刷。因此,我们还应该对短信进行良好的预警机制,即当短信使用量达到一定数量时,向管理员发送预警消息,管理员可以立即对短信界面进行监控和保护。

php设计短信验证码防刷机制几种方案相关推荐

  1. 注册短信验证码防刷设计方案

    1.需求:一定时间内禁止重复发送短信     两个时间要求     60秒后才可以重新发送短信验证码     发送的短信验证码10分钟内有效 2.方案 方式一:前端增加校验倒计时,不到60秒按钮不给点 ...

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

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

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

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

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

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

  5. java黑名单校验_短信验证码被刷怎么办?java 短信验证码防刷策略

    一 事件简述 这是一件发生在前段时间的事情,当时的情况是这样的:一个新的功能模块上线之后,出现短信接口被恶意访问调用的情况,请求数量很大,而且通过查看短信服务商控制台也发现,短信发送量在飙升,看着统计 ...

  6. java调用短信验证失败_短信验证码被刷怎么办?java 短信验证码防刷策略

    一 事件简述 这是一件发生在前段时间的事情,当时的情况是这样的:一个新的功能模块上线之后,出现短信接口被恶意访问调用的情况,请求数量很大,而且通过查看短信服务商控制台也发现,短信发送量在飙升,看着统计 ...

  7. 如何快速设计短信验证码

    ●●● 短信验证码浅析 什么地方会用到短信验证码 最常见的是各种产品的注册流程.短信验证码可降低非法注册.重复注册率,同时真实的手机号信息也利于产品运营.除注册外,登录,找回密码,开户,支付.更换设备 ...

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

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

  9. 短信接口防刷防轰炸解决方案Java接入教程- 企业短信防火墙+ 【中昱维信】短信验证码

    企业短信防火墙[新昕科技]+短信验证码[中昱维信]Java应用实例 一.企业短信防火墙的实现 1.1 简介 1.2 第一步:获取防火墙帐号密钥 1.3 第二步:下载防火墙服务器 1.4 第三步:业务系 ...

最新文章

  1. 裴健等9名华人当选加拿大皇家学会院士
  2. netstat -an 查看端口
  3. DIB位图(Bitmap)的读取和保存
  4. Struts2内置拦截器的简要介绍
  5. .NET Core + K8S + Loki 玩转日志聚合
  6. junit runner_了解JUnit的Runner架构
  7. php copy 文件夹,php删除与复制文件夹及其文件夹下所有文件的实现代码
  8. 深度学习(四十九)Tensorflow提高代码效率笔记
  9. (转)Spring如何装配各种集合类型的属性
  10. android mmkv使用_锦囊篇|一文摸懂SharedPreferences和MMKV(一)
  11. linux内核 semaphore,Linux内核参数信号量semaphore设置
  12. android分享功能为什么要申请第三方key,android一键分享功能不使用任何第三方sdk...
  13. 怎么在css中定义字体颜色,css中怎么设置字体颜色
  14. 来自一个曾经200斤现在140斤程序员的减肥成功经验(包含个人认为相对安全的饮食法推荐)
  15. 中国齿科粘接剂行业发展趋势及前景动态预测报告2022-2027年
  16. 由LHS和RHS深入理解javascript引擎与作用域的交互
  17. [ooc-lang]一门冷门的面向对象编程的语言使用小结
  18. 基于阿里云的智能插座——(立创EDA项目)
  19. Mysql教程(Windows)
  20. 望尽天涯路--从理财角度看高可用

热门文章

  1. 上海女孩,你凭什么和我谈车子房子
  2. Wind-Up Knight:发条骑士冒险记
  3. 如果你到了25岁,还没到30岁。——李开复
  4. CSS——伪元素:before画圆、插入图片
  5. java实现直线裁剪源码_谁有多边形裁剪或线段裁剪源码?
  6. 解决fedora下picasa无法启动
  7. 在OCP集群中安装NSX ALB AKO
  8. uboot为什么要重定位/代码拷贝?
  9. Linux升级python到3.6
  10. 开源即时通讯平台Tinode