2013-12-19 67 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()不是有效立刻。