如果用户使用以下代码单击按钮两次,我正在尝试防止用户重复提交表单。
// 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();
两个问题:
- 这个解决方案有什么问题吗?
- 调用 session_write_close() 后我还能获取和设置会话变量吗?
谢谢。
可能是相关的,我正在使用 ADOdb 将会话数据存储在数据库中