在阻止双重提交时,取消设置会话变量不起作用

时间:2013-12-19 11:57:05

标签: php session csrf adodb double-submit-problem

我正在尝试阻止用户使用以下代码点击按钮两次提交表单。

// 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(),我认为在我未设置之后添加它是有效的,但我真的不明白它的作用:

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

两个问题:

  1. 此解决方案有任何问题吗?
  2. 调用session_write_close()后,我仍可以获取并设置会话变量吗?
  3. 感谢。

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

1 个答案:

答案 0 :(得分:0)

尝试:

$_SESSION['token'] = null;

有时,unset()无法立即生效。