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'])似乎不起作用。在第二次请求中,令牌仍在会话中。我认为这是因为在下一次提交之前会话值没有被清除。

在这个对类似问题的回应中:建议使用https://stackoverflow.com/a/1025919/1587851 session_write_close(),我认为在我的 unset 工作后添加它,但我不太明白它的作用:

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

两个问题:

  1. 这个解决方案有什么问题吗?
  2. 调用 session_write_close() 后我还能获取和设置会话变量吗?

谢谢。

可能是相关的,我正在使用 ADOdb 将会话数据存储在数据库中

4

1 回答 1

0

试着做 :

$_SESSION['token'] = null;

有时,unset()它不会立即生效。

于 2013-12-19T15:09:01.873 回答