用PHP生成FORM键的聪明方法


Smart way to generate a FORM key with PHP

我有一个表单,在whmcs,我希望用户只能提交一次,所以他们不能提交和刷新重新提交…我正在考虑取消设置$_POST或重定向,但两者都不会在这种情况下工作,我将如何生成一个键,使它只可用一次?不能使用mysql。

为什么不在会话中存储一个随机密钥呢?这就是大多数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]变量。你必须根据你正在做的事情自己弄清楚逻辑。

My Logic是这样的:

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的预期目的,并且易于实现。