【发布时间】: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();
两个问题:
- 这个解决方案有什么问题吗?
- 在调用 session_write_close() 后我还能获取和设置会话变量吗?
谢谢。
可能是相关的,我正在使用 ADOdb 将会话数据存储在数据库中
【问题讨论】:
-
您是否在页面开头添加了“session_start()”?
-
@marm.ch 是的,它只是不在上面的 sn-p 上。
标签: php session csrf adodb double-submit-problem