防止直接存取PHP頁面,只能引用!這樣就不能直接存取B頁了。
也可以在A加COOKIE,B判斷COOKIE後用完刪掉COOKIE
防止刷新模組
所以就考慮增加一個參數來防止這類情況的發生,COOKIE和SESSION可供選擇,不過 COOKIE是客戶端的,如果人家禁用COOKIE的話,照樣可以惡意刷新點擊數。還是用SESSION的好,IP+URL參數的MD5值做 SESSION名,我想大家也不好偽造了吧.
實作原則 設定 max_reloadtime =100; //設定頁面刷新最長間隔時間
使用者第一次開啟頁面 記錄目前的時間會儲存在 session_start
使用者第二次開啟頁面(判斷 session_start是否存在) 用當前時間和 session_start 相減 得到差值 time_passed
當 time_passed
例:
-
-
session_start();
- $k = $_GET['k'];
- $t = $___GETGETGET ['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;
- }
- ?>
複製程式碼
例2,php防重複提交。
首先,可以定義一個session變數用來保存一個表單的提交序號。
這裡定義為「$userLastAction」。
然後,在表單裡加入一個 hidden變量,把值設為$userLastAction+1:
>
最後,在處理提交之前判斷表單是否已被提交過:
-
- if($lastAction>$userLastAction and inputIsValid(…)){
- $userLastAction++; // 序號加1
- // 處理表單資料
- }
複製程式碼
投稿頁:
-
-
- $_SESSION['code']=mt_rand(1,1000);//產生1到1000之間的隨機器數
- ?>
複製程式碼
被提交頁:
-
-
if($_SESSION['code']!=$_REQUEST['scode']){
- echo "請不要重複提交";
- exit;
- }
- $_SESSION['code']=0
/* 改良版
- PHP防止使用者刷新頁面(Refresh or Reload),重複提交表單內容。
- 由於表單變數的內容由$_POST['name']引用,也許在處理完表單後,直接將$_POST['name']銷毀(unset())即可。其實不然。可能由於頁面預設對表單內容進行了緩存,所以,即使銷毀了$_POST['name'],刷新後,$_POST['name']還是會被賦值,一樣有效。
- 可利用Session解決。首先給Session賦個值,例如400,第一次提交成功後改變Session的值,當第二次提交時去檢查這個Session 的值,如果不是400,就不再處理表單中的資料。
- 可設定Session的有效時間?
- */
- if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
- session_start();
- isset($_SESSION[ 'num']) 或 die ("no session");
- if ($_SESSION['num']==400){
- print '
- print_r($_POST);
- print 'Please try again';
- print '';
- $_SESSION[' num']=500;
- } else {
- print '
- print_r($_POST);
- echo "However you have submitted";
- print '';
- }
- } else {
- session_start() or die("session is not started");
- $_SESSION['num']= 400;
- ?>
- ?>
-
-
}
- ?>
複製程式碼
|