我有一个表单,在 whmcs 中,我希望用户只能提交一次,因此他们无法提交并刷新以重新提交...我正在考虑取消设置 $_POST 或重定向,但在这种情况下都行不通,如何我会生成一个密钥并使其只能使用一次吗?不能用mysql。
4 回答
为什么不在会话中存储随机密钥?这就是大多数 CRSF 令牌系统的工作方式:加载表单时,生成密钥并将其保存在会话中并将其包含在表单中。提交时,比较密钥并删除保存的密钥。
如果您只是不希望用户不小心重新提交成功提交的表单,@zerkms 评论中的链接就是您想要的:http ://en.wikipedia.org/wiki/Post/Redirect/Get
避免重复发布的最常见方法是
header('location: /'.$your_url_here);
在你完成你的动作之后。因此,您只需重定向到同一页面,但没有 $_POST。
提交表单时设置会话或 cookie,并预先检查它是否存在。
如果您想要永久检查,您还可以将信息存储在数据库中,例如他们的 IP 和浏览器,但这有其自身的问题,因此您永远不会 100% 地阻止某人。
我意识到这是一个老问题,但我最近遇到了同样的问题。如果您想留在产品详细信息页面(例如),即使您在 POST 之后切换到另一个 smarty 模板文件,所有 Post/Redirect/Get 解决方案似乎都无法在 WHMCS 上运行。可能是因为它需要 $_POST[id'] 并且在刷新后消失了。所以我能得到的最接近的是让它回到产品列表页面,这不是我想要的,也可能不是原始海报想要的。
我最终想出的解决方案是$_SESSION[submitted]
在表单提交后添加一个变量。你必须自己弄清楚逻辑,这取决于你在做什么。
我的逻辑是这样的:
if ($_SESSION['submitted'] == 1 && !isset($_POST['somecustomkey'])) {
unset($_SESSION['submitted']);
}
如果您的 POST 表单数据不存在,它位于顶部并重置“提交的”会话密钥。
然后在将信息写入数据库或其他任何内容之前添加检查。
if ($_SESSION['submitted'] != 1) {
//Do some stuff with $_POST form data
$_SESSION['submitted'] = 1;
}
我认为这很符合 $_SESSION 的预期目的并且易于实现。