1

我有一个表单,在 whmcs 中,我希望用户只能提交一次,因此他们无法提交并刷新以重新提交...我正在考虑取消设置 $_POST 或重定向,但在这种情况下都行不通,如何我会生成一个密钥并使其只能使用一次吗?不能用mysql。

4

4 回答 4

3

为什么不在会话中存储随机密钥?这就是大多数 CRSF 令牌系统的工作方式:加载表单时,生成密钥并将其保存在会话中并将其包含在表单中。提交时,比较密钥并删除保存的密钥。

如果您只是不希望用户不小心重新提交成功提交的表单,@zerkms 评论中的链接就是您想要的:http ://en.wikipedia.org/wiki/Post/Redirect/Get

于 2011-11-07T14:31:12.510 回答
1

避免重复发布的最常见方法是

header('location: /'.$your_url_here);

在你完成你的动作之后。因此,您只需重定向到同一页面,但没有 $_POST。

于 2011-11-07T14:33:09.780 回答
0

提交表单时设置会话或 cookie,并预先检查它是否存在。

如果您想要永久检查,您还可以将信息存储在数据库中,例如他们的 IP 和浏览器,但这有其自身的问题,因此您永远不会 100% 地阻止某人。

于 2011-11-07T14:32:53.467 回答
0

我意识到这是一个老问题,但我最近遇到了同样的问题。如果您想留在产品详细信息页面(例如),即使您在 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 的预期目的并且易于实现。

于 2016-07-10T19:49:26.823 回答