场景

在注册,修改密码,找回密码等场景里,我们都会遇到发送手机短信进行验证码验证,我们都知道,手机的这个短信接口是需要购买了,为了防刷,我们就会对短信验证码发送次数的限制,我们应该如何防止呢?

很多人都会这样做:对用户获取短信验证码的手机号、ip、和浏览器(使用唯一标识)进行限制。

本文介绍的方法是对用户每天只能通过同一浏览器或同一ip地址获取验证码10次或者同一手机号只能获取3次短信验证码,三种限制为“或”关系,一条超限就不发验证码。方法是通过在服务器端将用户的手机号、ip、ur_r标识记录并写入文件,再通过读取文件记录判断用户请求发送验证码的次数来做限制。

方法如下:

这里是获取短信验证码页面:

<!DOCTYPE html>
<html>
<head></head>
<body>
<!-- 隐藏表单uv_r标识,用于对获取验证码的浏览器进行限制,唯一标识存储于浏览器cookie中。在用户进行获取短信验证码操作时将标识传入后台代码(可以通过js传入后台,此处未提供js代码) -->
<input type="hidden" name="uv_r" value="" id="uv_r">
</body>
<script type=”text/javascript”>
/*
使用js获取cookie中ur_r唯一标识,如果不存在,生成唯一标识,js写入cookie,并将唯一标识赋给隐藏表单。
*///唯一标识存入cookievar _uuid = getUUID();if(getCookie("_UUID_UV")!=null && getCookie("_UUID_UV")!=undefined){_uuid = getCookie("_UUID_UV");}else{setCookie("_UUID_UV",_uuid);}document.getElementById("uv_r").value = _uuid;//赋给hidden表单//生成唯一标识function getUUID(){var uuid = new Date().getTime();var randomNum =parseInt(Math.random()*1000);return uuid+randomNum.toString();}//写cookiefunction setCookie(name,value){var Days = 365;//这里设置cookie存在时间为一年var exp = new Date();exp.setTime(exp.getTime() + Days*24*60*60*1000);document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();}//获取cookiefunction getCookie(name){var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");if(arr=document.cookie.match(reg))return unescape(arr[2]);elsereturn null;}
</script>
</html>

后端PHP短信限制次数等的封装类:

Class regMod{
//定义全局变量,用于设置记录文件的路径
Protected $Root = null;
Public function __construct(){
$this -> Root = APP_PATH."/data/msg_logs/";//自己定义的文件存放位置
}
//获取短信验证码操作(Ajax方法为好)
Public function get_authentication_code(){
if ($_POST['uv_r'] && $_POST['tel']) {
$ip=$_SERVER["REMOTE_ADDR"];//ip$tel = $_POST['tel'];//电话$uv_r = $_POST['uv_r'];//ur_r标识if(empty($uv_r)){$uv_r = 0;}
}//判断数据是否超过了限制
$uvr_num = $this->checkUvr($uv_r);
$tel_num = $this->checkTel($tel);
$ip_num = $this->checkIp($ip);if ($uvr_num < 10 && $tel_num < 4 && $ip_num < 10) {
Echo "发送验证码";//符合发送条件,发送验证码的操作
} else {
Echo “不发送验证码”;
//当不发送验证码时,将数据存入文件,用于方便查询
$data = $tel . "|" . $ip . "|" . $uv_r . "|";if ($uv_r>0 && $uvr_num >= 10) {$data = $data . "A@";}if ($tel_num >= 4) {$data = $data . "B@";}if ($ip_num >= 10) {$data = $data . "C@";}$this->wirteFile("", $data);$this->ajax_return(0, "您今日获取短信验证码的次数过多!");//给用户返回信息,ajax_return()为自写方法(未提供)}
}
//以下方法为私有方法
//检测ur_r在文件中出现的次数
Private function checkUvr($data){$fileName = "Uv_".date("Ymd",time()).".dat";$filePath = ($this -> Root).$fileName;//组装要写入的文件的路径$c_sum = 0;if(file_exists($filePath)){//文件存在获取次数并将此次请求的数据写入$arr=file_get_contents($filePath);$row=explode("|",$arr);$countArr=array_count_values($row);$c_sum = $countArr[$data];if($c_sum<10){$this -> wirteFile($filePath,$data."|");}return $c_sum;}else{//文件不存在创建文件并写入本次数据,返回次数0$this -> wirteFile($filePath,$data."|");return $c_sum;}
}
//检测Tel在文件中出现的次数
Private function checkTel($data){$fileName = "Tel_".date("Ymd",time()).".dat";$filePath = ($this -> Root).$fileName;$c_sum = 0;if(file_exists($filePath)){$arr=file_get_contents($filePath);$row=explode("|",$arr);$countArr=array_count_values($row);$c_sum = $countArr[$data];if($c_sum<4){$this -> wirteFile($filePath,$data."|");}return $c_sum;}else{$this -> wirteFile($filePath,$data."|");return $c_sum;}
}
//检测IP在文件中存在的次数
Private function checkIp($data){$fileName = "Ip_".date("Ymd",time()).".dat";$filePath = ($this -> Root).$fileName;$c_sum = 0;if(file_exists($filePath)){$arr=file_get_contents($filePath);$row=explode("|",$arr);$countArr=array_count_values($row);$c_sum = $countArr[$data];if($c_sum<10){$this -> wirteFile($filePath,$data."|");}return $c_sum;}else{$this -> wirteFile($filePath,$data."|");return $c_sum;}
}
/**
* 将数据写入本地文件
* @param $filePath 要写入文件的路径
* @param $data 写入的数据
*/
Private function wirteFile($filePath,$data){
try {if(!is_dir($this->Root)){//判断文件所在目录是否存在,不存在就创建mkdir($this->Root, 0777, true);}if($filePath==""){//此处是不发送验证码时,记录日志创建的文件$filePath = ($this -> Root)."N".date("Ymd",time()).".dat";}
//写入文件操作$fp=fopen($filePath,"a+");//得到指针fwrite($fp,$data);//写fclose($fp);//关闭} catch (Exception $e) { print $e->getMessage();    }
}}

接下来的一步就是你需要在哪里用到短信限制,比如注册,密码找回,修改密码等方法里,直接实例化此封装的类就可以用了。

对短信验证码发送次数的限制相关推荐

  1. QPW 手机短信验证码发送日志表(tf_sms_send_log)

    文章目录 手机短信验证码发送日志表 需求说明 手机短信验证码发送日志表 CREATE TABLE `tf_sms_send_log` (`send_id` bigint(11) NOT NULL AU ...

  2. 短信验证码发送失败的常见原因有哪些?

    短信验证码现在几乎已成为互联网各行业的标配所在,在账户注册.密码修改.支付确认等方面发挥着重要的作用.目前通过短信验证码接口接入第三方短信验证码平台的短信服务,99%以上的用户基本上都可以在几秒钟之内 ...

  3. php调用nexmo发送短信,在 Laravel 中 “规范” 的开发短信验证码发送功能

    Laravel简介 Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行 ...

  4. flask项目之5:短信验证码发送

    概述: 短信验证码的发送需要限制验证码的发送间隔不能不停的发,因为测试时发送的验证码是要花钱的,不可能不花钱就办事 短信验证码要根据图片验证码是不是正确再进行发, 进行短信验证码的实验要测试容联云平台 ...

  5. 手机短信验证码发送(106短信验证码发送)

    打开网页地址栏输入:http://www.106jiekou.com/ 需要用户注册,登陆,在上边购买短信,大概是10块钱100条, 买完之后可以直接下载接口说明文档和源代码的案例,是个压缩包 cu- ...

  6. 使用Mob进行短信验证码发送

    首先,很多第三方短信验证码都可以,为什么我要选择mob的呢? 因为mob的短信验证码是完全免费 并且支持IOS,Android,Unity3d,Cocos2d-X的集成 Mob的官网:全球领先的数据智 ...

  7. 网易云信-短信验证码发送、验证

    提示:本文仅记录本人工作中遇到的难点与个人见解,仅供参考,如有问题请见谅. 目录 前言 一.网易云信短信服务是什么? 二.使用步骤 1.创建网易云信工具类CheckSumBuilder 2.短信验证码 ...

  8. 怎样避免短信验证码发送失败

    大家都知道生活中短信验证码是必不可少的,我们更改密码,确认身份还有日常交易,或者是使用app短信平台,都会接触到短信验证码,但是有时候会遇到点击"发送验证码"后没收到短信验证码的现 ...

  9. java实现短信验证码发送(架子是springboot 服务平台选择腾讯云短信服务)

    业务需求:公司扩展新业务,新增短信验证码提醒服务,负责功能模块完善 暂时只研究了腾讯短信服务的发送(看api谁都能copy出来),短信状态回执(也挺简单,只是自己想复杂了),短信回复回执(暂时没弄明白 ...

  10. rabbitMQ的使用概述及使用rabbitMQ进行短信验证码发送案例

    概述 首先来看一张图 在图中可以看到,用户注册通常需要完成两件事,向用户发送验证码码,及对用户验证码.信息的校对.初始化,在没有使用的MQ的项目中,验证码的生成.存储.发送都是由调用方法完成的,虽然可 ...

最新文章

  1. @SkipValidation跳过Struts2validation校验器
  2. Java中四则运算的那些坑
  3. 如何做网络推广告诉你如何更新网站内容会提升索引收录?
  4. java rtmp m3u8_vue常用插件之视频播放(rtmp m3u8)
  5. java类作为多层级的数据实体_API json多层数据实体类封装(利用泛型技术)
  6. javascript学习之数组的使用四 concat方法 join方法 reverse方法 sort方法
  7. ajax中的application/x-www-form-urlencoded中的使用
  8. 对边缘计算与云原生的理解与思考
  9. ASM 管理 转自三思笔记
  10. 新型人肉搜索Ark将完胜谷歌?
  11. 清理android根目录垃圾,安卓清理君——清除手机垃圾
  12. 傅立叶级数与傅里叶变换
  13. c语言中的布尔类型头文件,C语言的布尔类型(_Bool)
  14. win10误删的注册表能还原吗_win10自带注册表恢复方法 win10注册表误删如何修复...
  15. 404页面是什么意思?怎么正确设置?
  16. 移动端性能专项测试之 CPU
  17. MaskFormer
  18. 【观察】大数据3.0新时代 星环科技的思与行
  19. WORD中如何删除掉某几页的页眉和页脚
  20. js 在js字符串中添加空格

热门文章

  1. 博客群建,SEO多用户博客群建-skycc多用户博客群建系统
  2. 在Fcitx5中使用自定义双拼方案
  3. shell 脚本之 Function 功能的使用
  4. vuex报错TypeError: sub is not a function
  5. Android开发—智能家居系列-----智能家居原理
  6. 【find128】项目
  7. ps3本服务器维修,ps3端ftp服务器
  8. 安装带有 SSH 的 SOCKS 服务器!
  9. CHM 打开时提示 已取消到该网页的导航
  10. 文件分割与合并(Java)