【问题标题】:Smart way to generate a FORM key with PHP用 PHP 生成 FORM 密钥的聪明方法
【发布时间】:2011-11-07 14:29:21
【问题描述】:

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

【问题讨论】:

标签: php whmcs


【解决方案1】:

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

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

【讨论】:

  • 是的,创建一个随机密钥,将其放入会话和表单中,并在收到 POST 时进行比较。您可以使用 Javascript 在表单中执行某些操作,但由于这是在客户端,您不能依赖它。
【解决方案2】:

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

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

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

【讨论】:

  • 我建议在标题后添加exit();
  • 不行,因为页面始终需要 $_POST['id']。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 2012-12-01
      • 2021-02-08
      • 2021-06-29
      • 2020-10-13
      • 2013-09-26
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多