2013-12-19 43 views
1

我想阻止用戶雙提交表單,如果他們單擊按鈕兩次使用下面的代碼。取消設置會話變量不工作時,防止雙重提交

// Check token is present 
if (!isset($_POST['token'])) { 
    // Token missing 
    exit(); 
} 

// Check token matches session value 
if ($_POST['token'] != $_SESSION['token']) { 
    // Token mismatch 
    exit(); 
} 

// Valid submission - Invalidate token 
unset($_SESSION['token']); 


// Make payment 
$result = makePayment(); // cURL request to api 

問題是unset($_SESSION['token'])似乎沒有工作。在第二個請求中,令牌仍在會話中。我認爲這是因爲會話值在下次提交之前沒有被清除。

在這種resepnse一個類似的問題:https://stackoverflow.com/a/1025919/1587851session_write_close()建議,我想後,我的沒有設置正在增加,但我真的不明白它做什麼:

// Valid submission - Invalidate token 
unset($_SESSION['token']); 
session_write_close(); 

兩個問題:

  1. 這個解決方案有什麼問題嗎?
  2. 我可以在調用session_write_close()後仍然獲取並設置會話變量嗎?

謝謝。

可能是相關的,我使用ADOdb的會話數據存儲在數據庫中

+0

您是否在頁面的開頭放置了「session_start()」? –

+0

@ mArm.ch是的,它只是不在上面的代碼片段。 – paul

回答

0

儘量做到:

$_SESSION['token'] = null; 

有時候,unset()不是有效立刻。