内网通修改积分文件_转盘抽奖分享得积分,你是如何防止页面被恶意刷新的
惡意刷新
惡意刷新就是不停的去刷新提交頁面,導致出現大量無效數據,這類問題在實際應用中我們經常遇到,比如一個活動的分享得積分,刷票,刷紅包等等,遇到這些問題,你是如何去防止的。
當你在做一個刷紅包的活動,或者一個分享得積分的活動時,頻繁的被刷新會導致數據庫吃緊,嚴重時會導致系統死機。遇到這方面你是如何防止惡意刷新頁面的,說白了也就是惡意刷新你創建的鏈接。
下面我們來看看防止惡意刷頁面的原理:
1 要求在頁面間傳遞一個驗證字符串;
2 在生成頁面的時候 隨機產生一個字符串;
3 做為一個必須參數在所有連接中傳遞。同時將這個字符串保存在session中;
點連接或者表單進入頁面后,判斷session中的驗證碼是不是與用戶提交的相同,如果相同,則處理,不相同則認為是重復刷新;
4 在處理完成后將重新生成一個驗證碼,用于新頁面的生成。
我們可以從session方面防止用戶惡意刷新。
代碼如下:
方案一:
<?php session_start(); $k=$_GET['k']; $t=$_GET['t']; $allowTime = 1800;//防刷新時間 $ip = get_client_ip(); $allowT = md5($ip.$k.$t); if(!isset($_SESSION[$allowT])) { $refresh = true; $_SESSION[$allowT] = time(); }elseif(time() - $_SESSION[$allowT]>$allowTime){ $refresh = true; $_SESSION[$allowT] = time(); }else{ $refresh = false; } ?>方案二:
<?php session_start(); $allow_sep = "2"; if (isset($_SESSION["post_sep"])) { if (time() - $_SESSION["post_sep"] < $allow_sep) { exit("請不要頻繁刷新,休息2秒再刷新吧"); } else { $_SESSION["post_sep"] = time(); } } else { $_SESSION["post_sep"] = time(); } ?>方案三:
<?php session_start(); if(!empty($_POST[name])){ $data = $_POST[name]; $tag = $_POST[tag]; if($_SESSION[status]==$tag){ echo $data; }else{ echo "不允許刷新!"; } } $v = mt_rand(1,10000); ?> <?php echo $v; $_SESSION[status] = $v; ?>上面的代碼是基于 session的驗證,假設你在2秒內刷新了頁面,那么他會執行exit() 函數輸出一條消息,并退出當前腳本,于是就不會加載下面的內容,所以這段代碼最好放在header中,先讓代碼執行,再加載其他的東西.
如果把代碼放在了footer里,結果整個頁面都加載了只在最后一行輸出了"請不要頻繁刷新",放在header中,效果比較好,想看效果的話按兩下F5 吧.
當然最好的是采用的是新建一個php文件,然后在header調用.
這樣做的好處有兩個:
一個是修改功能代碼方便,不用每次都打開header文件,也不怕誤改了其他地方的代碼,二是一旦出錯,可以快速修改并檢查,甚至可以直接刪除文件,代碼如下:
<?php include('includes/forbiddenCC.php'); ?>這里要注意下,必須調用在所有頁面的最前面.
你也可以結合cookie與session一起用,代碼如下: 利用文件存儲數據
<?php $c_file="counter.txt"; //文件名賦值給變量 //如果文件不存在的操作 if(!file_exists($c_file)) { $myfile=fopen($c_file,"w"); //創建文件 fwrite($myfile,"0"); //置入“0” fclose($myfile); //關閉文件 } $t_num=file($c_file); //把文件內容讀入變量 if($_COOKIE["date"]!="date(Y年m月d日)"){ //判斷COOKIE內容與當前日期是否一致 $t_num[0]++; //原始數據自增1 $myfile=fopen($c_file,"w"); //寫入方式打開文件 fwrite($myfile,$t_num[0]); //寫入新數值 fclose($myfile); //關閉文件 //重新將當前日期寫入COOKIE并設定COOKIE的有效期為24小時 setcookie("date","date(Y年m月d日)",time()+60*60*24); }?>這里讀取數據
<?php //使用文本存儲數據 if($_SESSION[temp]==""){ if(($fp=fopen("counter.txt","r"))==false){ echo "打開文件失敗!"; }else{ //讀取文件中數據 $counter=fgets($fp,1024); //關閉文本文件 fclose($fp); //計數器增加1 $counter++; //以寫的方式打開文本文件 $fp=fopen("counter.txt","w"); //將新的統計數據增加1 fputs($fp,$counter); fclose($fp); } //從文本文件中讀取統計數據 if(($fp=fopen("counter.txt","r"))==false){ echo "打開文件失敗!"; }else{ $counter=fgets($fp,1024); fclose($fp); //輸出訪問次數 echo "數字計數器: " .$counter ; } //登錄以后,$_SESSION[temp]的值不為空,給$_SESSION[temp]賦一個1 $_SESSION[temp]=1; }else{ echo ""; }?>其中counter.txt 文件為同目錄下的記錄登錄數文件。$counter=fgets($fp,1024); 為讀取文件中數值型值的方法(可包含小數點數值)
以上幾種方案你可以根據自己的業務情況來實現.
以上是本文的全部內容,希望對大家的學習有幫助,也希望大家多多支持 php自學中心
感謝閱讀!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的内网通修改积分文件_转盘抽奖分享得积分,你是如何防止页面被恶意刷新的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring集成redis(Spring
- 下一篇: 后处理安装_核燃料后处理设施中的热室