PHP限制發(fā)送驗證碼條數(shù)(防刷驗證碼)

因為項目原因,最近在頻繁接觸短信驗證這一功能,前幾天剛接入了短信驗證碼的接口,現(xiàn)在又要準備做一個新功能上去,為了防止被刷,需要增加一個新的限制,限制每天用戶獲取驗證碼的條數(shù)。接入的接口是互億無線短信平臺的接口,因為贈送新用戶贈送10條短信,所以我申請了很多賬號。

本文介紹的方法是對用戶每天只能通過同一瀏覽器或同一ip地址獲取驗證碼10次或者同一手機號只能獲取3次短信驗證碼,三種限制為“或”關(guān)系,一條超限就不發(fā)驗證碼。方法是通過在服務(wù)器端將用戶的手機號、ip、ur_r記錄并寫入文件,再通過讀取文件記錄判斷用戶請求發(fā)送驗證碼的次數(shù)來做限制。方法如下:

? 1 <?php

? 2 Class regMod{

? 3 //定義全局變量,用于設(shè)置記錄文件的路徑

? 4 Protected $Root = null;

? 5 Public function __construct(){

? 6 $this -> Root = APP_PATH."/data/msg_logs/";//自己定義的文件存放位置

? 7 }

? 8 //獲取短信驗證碼操作(Ajax方法為好)

? 9 Public function get_authentication_code(){

10 if ($_POST['uv_r'] && $_POST['tel']) {

11 $ip=$_SERVER["REMOTE_ADDR"];//ip

12? ? $tel = $_POST['tel'];//電話

13? ? $uv_r = $_POST['uv_r'];//ur_r標識

14? ? if(empty($uv_r)){

15? ? ? ? $uv_r = 0;

16? ? }

17 }

18

19? ? ? ? ? ? //判斷數(shù)據(jù)是否超過了限制

20 $uvr_num = $this->checkUvr($uv_r);

21 $tel_num = $this->checkTel($tel);

22 $ip_num = $this->checkIp($ip);

23

24 if ($uvr_num < 10 && $tel_num < 4 && $ip_num < 10) {

25 Echo "發(fā)送驗證碼";//符合發(fā)送條件,發(fā)送驗證碼的操作

26 } else {

27 Echo “不發(fā)送驗證碼”;

28 //當(dāng)不發(fā)送驗證碼時,將數(shù)據(jù)存入文件,用于方便查詢

29 $data = $tel . "|" . $ip . "|" . $uv_r . "|";

30? ? if ($uv_r>0 && $uvr_num >= 10) {

31? ? ? ? $data = $data . "A@";

32? ? }

33? ? if ($tel_num >= 4) {

34? ? ? ? $data = $data . "B@";

35? ? }

36? ? if ($ip_num >= 10) {

37? ? ? ? $data = $data . "C@";

38? ? }

39? ? $this->wirteFile("", $data);

40? ? $this->ajax_return(0, "您今日獲取短信驗證碼的次數(shù)過多!");//給用戶返回信息,ajax_return()為自寫方法(未提供)

41? ? }

42 }

43 //以下方法為私有方法

44 //檢測ur_r在文件中出現(xiàn)的次數(shù)

45 Private function checkUvr($data){

46? ? $fileName = "Uv_".date("Ymd",time()).".dat";

47? ? $filePath = ($this -> Root).$fileName;//組裝要寫入的文件的路徑

48? ? $c_sum = 0;

49? ? if(file_exists($filePath)){//文件存在獲取次數(shù)并將此次請求的數(shù)據(jù)寫入

50? ? ? ? $arr=file_get_contents($filePath);

51? ? ? ? $row=explode("|",$arr);

52? ? ? ? $countArr=array_count_values($row);

53? ? ? ? $c_sum = $countArr[$data];

54? ? ? ? if($c_sum<10)

55? ? ? ? {

56? ? ? ? ? ? $this -> wirteFile($filePath,$data."|");

57? ? ? ? }

58? ? ? ? return $c_sum;

59? ? }else{//文件不存在創(chuàng)建文件并寫入本次數(shù)據(jù),返回次數(shù)0

60? ? ? ? $this -> wirteFile($filePath,$data."|");

61? ? ? ? return $c_sum;

62? ? }

63 }

64 //檢測Tel在文件中出現(xiàn)的次數(shù)

65 Private function checkTel($data){

66? ? $fileName = "Tel_".date("Ymd",time()).".dat";

67? ? $filePath = ($this -> Root).$fileName;

68? ? $c_sum = 0;

69? ? if(file_exists($filePath)){

70? ? ? ? $arr=file_get_contents($filePath);

71? ? ? ? $row=explode("|",$arr);

72? ? ? ? $countArr=array_count_values($row);

73? ? ? ? $c_sum = $countArr[$data];

74? ? ? ? if($c_sum<4)

75? ? ? ? {

76? ? ? ? ? ? $this -> wirteFile($filePath,$data."|");

77? ? ? ? }

78? ? ? ? return $c_sum;

79? ? }else{

80? ? ? ? $this -> wirteFile($filePath,$data."|");

81? ? ? ? return $c_sum;

82? ? }

83 }

84 //檢測IP在文件中存在的次數(shù)

85 Private function checkIp($data){

86? ? $fileName = "Ip_".date("Ymd",time()).".dat";

87? ? $filePath = ($this -> Root).$fileName;

88? ? $c_sum = 0;

89? ? if(file_exists($filePath)){

90? ? ? ? $arr=file_get_contents($filePath);

91? ? ? ? $row=explode("|",$arr);

92? ? ? ? $countArr=array_count_values($row);

93? ? ? ? $c_sum = $countArr[$data];

94? ? ? ? if($c_sum<10)

95? ? ? ? {

96? ? ? ? ? ? $this -> wirteFile($filePath,$data."|");

97? ? ? ? }

98? ? ? ? return $c_sum;

99? ? }else{

100? ? ? ? $this -> wirteFile($filePath,$data."|");

101? ? ? ? return $c_sum;

102? ? }

103 }

104 /**

105 * 將數(shù)據(jù)寫入本地文件

106 * @param $filePath 要寫入文件的路徑

107 * @param $data 寫入的數(shù)據(jù)

108 */

109 Private function wirteFile($filePath,$data){

110 try {

111? ? ? ? if(!is_dir($this->Root)){//判斷文件所在目錄是否存在,不存在就創(chuàng)建

112? ? ? ? ? ? mkdir($this->Root, 0777, true);

113? ? ? ? }

114? ? ? ? if($filePath==""){//此處是不發(fā)送驗證碼時,記錄日志創(chuàng)建的文件

115? ? ? ? ? ? $filePath = ($this -> Root)."N".date("Ymd",time()).".dat";

116? ? ? ? }

117 //寫入文件操作

118? ? ? ? $fp=fopen($filePath,"a+");//得到指針

119? ? ? ? fwrite($fp,$data);//寫

120? ? ? ? fclose($fp);//關(guān)閉

121? ? } catch (Exception $e) { print $e->getMessage();? ? }

122 }

123

124 }

125 ?>

---------------------

作者:@互億無線

來源:CSDN

原文:https://blog.csdn.net/weixin_43735367/article/details/84297214

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,045評論 0 2
  • 這期我們學(xué)習(xí)了“創(chuàng)造性”地工作與“掃地”改變?nèi)松?,讓我更加懂得在人生的道路上就是要不斷學(xué)習(xí)、開闊視野,不要滿足于現(xiàn)...
    洪開全閱讀 268評論 0 0
  • 曾經(jīng)只愛陌生人。 別人稍一注意你,你就敞開心扉,你覺得這是坦率,其實這是孤獨?? 年少輕狂的孤獨 少年時,正趕上離...
    低效率的勤奮者閱讀 276評論 4 3
  • 2017.4.10 我滴媽呀,怎么頭越來越沉呢?好似都塊成木頭腦袋了。 為什么對海濤說的覺得索然無味呢? 自己在能...
    陳艷霞小樹媽閱讀 167評論 0 0
  • 電影散場以后一個人呆坐到保潔阿姨打掃完衛(wèi)生,站起來的一瞬間還是沒崩住。 嗯,我知道,我該放手了。 看到孟云穿成至尊...
    不知道能不能閱讀 323評論 0 0

友情鏈接更多精彩內(nèi)容