2010-09-06 60 views
1

有人可以看看我的兩個函數,並建議我可以做什麼?我創建了兩個函數,基本上創建一個唯一的鍵,這是在窗體中的隱藏字段中回顯,然後直接檢查表單是否已提交後,第二個函數檢查隱藏字段中的鍵是否與鍵匹配在會議中。PHP form key bug

我現在遇到的問題是現在又一次,它只是將我重定向到禁止頁面,暗示鍵不匹配,儘管我沒有編輯表單鍵故意使用我的Firefox Web開發工具進行測試。

我不確定這是否是一個緩存問題,任何人都可以看到是否有什麼我錯過了或可以改善?它只會一次又一次地發生,例如,如果我多次提交表單,它可能會轉到禁止頁面,暗示隱藏字段中的鍵與會話中的鍵不匹配,儘管我沒有看到兩個錯誤功能。

這是我的第一個函數,它創建了一個唯一的鍵,並在窗體的隱藏字段中回顯出來。我也有時間限制用戶必須提交表單的時間長度,但我現在已經評論了這一點,因爲它在啓用時似乎更頻繁地發生。

 
function GenerateFormTokenHash($token) 
{ 
    $token = $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 
    //$token_time = $_SESSION['token_time'] = time(); 
    return htmlspecialchars($token); 
    //return $token_time; 
} 

要使用上面的函數,我只需要echo GenerateFormTokenHash($ token);在一個隱藏的被叫令牌中。

我檢查表單是否已提交後,直接使用下面的函數。

 
# Form Token Hash Validator 
function IsValidFormTokenHash() 
{ 
    /*global $websiteaddress; 
     $token_age = time() - $_SESSION['token_time']; 
     if($token_age >= 300) { 
      echo 'Session Expired'; 
      echo 'This form has now expired. '; 
      echo 'Please click here to go back to the form.'; 
      $_SESSION = array(); 
      setcookie(session_name(), '', time()-42000, '/'); 
      # Destroy the session 
      session_destroy(); 
      # Generate new seesion id 
      session_regenerate_id(true); 
      exit; 
     }*/ 
    if(isset($_POST['token']) && $_POST['token'] != $_SESSION['token'] || !isset($_POST['token']) || !isset($_SESSION['token'])) 
    { 
       $_SESSION = array(); 
       setcookie(session_name(), '', time()-42000, '/'); 
       # Destroy the session 
       session_destroy(); 
       # Generate new seesion id 
       session_regenerate_id(true); 
     redirect("/error/forbidden.php"); 
     exit; 
    } 
} 

再次證明函數是在我functions.php文件等以後我檢查表已提交我簡單地調用該函數如下:

 
if(isset($_POST['submit'])) { 
    IsValidFormTokenHash(); 
} 

所以我基本上是試圖找出爲什麼有時偶爾會認爲隱藏字段中的會話密鑰和密鑰不匹配,可能是緩存問題,或者我可以做些什麼來確保其正常工作?

回答

3

也許你需要的是把括號圍繞你if檢查部分,他們可能得到另一種方式比你的邏輯評估需求:

if((isset($_POST['token']) && $_POST['token'] != $_SESSION['token']) //<-- added parenthesis around those 
    || !isset($_POST['token']) 
    || !isset($_SESSION['token'])) 
+0

「非常肯定的。」我同意了! – mattbasta 2010-09-07 02:54:12

+0

感謝aularon似乎很好,非常感謝您的時間和幫助:) – PHPLOVER 2010-09-07 03:56:31