2011-11-07 101 views
1

一个FORM键我有一个形式,我想用户只能提交一次WHMCS,所以他们不能提交,并刷新重新提交......我在想你重置$ _ POST或重定向,但在这种情况下都不会起作用,我将如何生成一个密钥并使其唯一可用一次?不能使用mysql。智能的方式来生成与PHP

+0

http://en.wikipedia.org/wiki/Post/Redirect/Get – zerkms

+0

可能重复[如何防止用户提交表单两次](http://stackoverflow.com/questions/16814157/how-以防止用户从提交表单两次) – Gajus

回答

3

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

如果你只是不希望用户意外地重新提交成功提交表单,从@zerkms'评论的链接是你想要的:http://en.wikipedia.org/wiki/Post/Redirect/Get

+0

是的,创建一个随机密钥,把它放在会话和窗体中,并在接收POST时进行比较。你可以在JavaScript中做一些事情,但是因为这是在客户端,所以你不能依赖它。 – Flo

0

当表单被提交设置会话或Cookie及检查它是否存在。

你也可以存储在数据库中的信息,如他们的IP和浏览器,如果你想进行长期的检查,但是这有它自己的问题,所以你永远不会阻止别人时间的100%。

1

最常见的方式,以避免重复张贴是做

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

您完成动作之后。所以你只是重定向到同一页面,但没有$ _POST。

+1

我建议加上'出口();'头后 – Tech4Wilco

+0

对,没错,我也这样做 - 只是忘了在这里写:) – oyatek

+0

都能跟得上不能做,作为页面需要$ _ POST [“身份证”]在一直。 –

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