【问题标题】:Unset session variable not working when preventing double submissions防止重复提交时取消设置会话变量不起作用
【发布时间】:2013-12-19 11:57:04
【问题描述】:

如果用户使用以下代码单击按钮两次,我正在尝试防止用户重复提交表单。

// 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 将会话数据存储在数据库中

【问题讨论】:

  • 您是否在页面开头添加了“session_start()”?
  • @marm.ch 是的,它只是不在上面的 sn-p 上。

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


【解决方案1】:

尝试做:

$_SESSION['token'] = null;

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

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 2016-10-01
    • 2013-02-17
    • 2017-03-17
    • 2015-03-03
    • 2012-10-15
    • 2018-03-16
    相关资源
    最近更新 更多