婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > php實現對短信驗證碼發送次數的限制實例講解

php實現對短信驗證碼發送次數的限制實例講解

熱門標簽:注冊400電話申請 福州人工外呼系統哪家強 地圖標注平臺怎么給錢注冊 衡水外呼系統平臺 新河科技智能外呼系統怎么樣 百度商鋪地圖標注 常州地圖標注服務商 釘釘打卡地圖標注 安裝電銷外呼系統

場景

在注冊,修改密碼,找回密碼等場景里,我們都會遇到發送手機短信進行驗證碼驗證,我們都知道,手機的這個短信接口是需要購買了,為了防刷,我們就會對短信驗證碼發送次數的限制,我們應該如何防止呢?

很多人都會這樣做:對用戶獲取短信驗證碼的手機號、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,并將唯一標識賦給隱藏表單。
*/
 //唯一標識存入cookie
    var _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();
    }
    //寫cookie
    function 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();
    }
    //獲取cookie
    function getCookie(name)
    {
      var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
      if(arr=document.cookie.match(reg))
        return unescape(arr[2]);
      else
        return 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_sum10)
    {
      $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_sum4)
    {
      $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_sum10)
    {
      $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();  }
}
 
}

接下來的一步就是你需要在哪里用到短信限制,比如注冊,密碼找回,修改密碼等方法里,直接實例化此封裝的類就可以用了。

到此這篇關于php實現對短信驗證碼發送次數的限制實例講解的文章就介紹到這了,更多相關php實現對短信驗證碼發送次數的限制內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • PHP使用gearman進行異步的郵件或短信發送操作詳解
  • php版阿里大于(阿里大魚)短信發送實例詳解
  • php實現短信發送代碼
  • php天翼開放平臺短信發送接口實現方法
  • Google Voice 短信發送接口PHP開源版(2010.5更新)

標簽:唐山 克拉瑪依 白城 六安 鷹潭 遼陽 柳州 鶴崗

巨人網絡通訊聲明:本文標題《php實現對短信驗證碼發送次數的限制實例講解》,本文關鍵詞  php,實現,對,短信,驗證,碼,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《php實現對短信驗證碼發送次數的限制實例講解》相關的同類信息!
  • 本頁收集關于php實現對短信驗證碼發送次數的限制實例講解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 石首市| 峡江县| 贵州省| 丰原市| 南乐县| 昌邑市| 内江市| 磐石市| 阳原县| 安达市| 平塘县| 潜江市| 张家港市| 普定县| 筠连县| 安溪县| 南平市| 新闻| 新干县| 海阳市| 河曲县| 墨竹工卡县| 鹤庆县| 衡阳市| 合川市| 钟祥市| 比如县| 黑水县| 湘西| 沽源县| 额敏县| 杂多县| 银川市| 彩票| 新兴县| 抚州市| 太保市| 沂源县| 密云县| 保康县| 赣榆县|