防止页面刷新PHP上的重复记录插入

时间:2012-08-22 09:53:40

标签: php ajax row insertion

我可以看到在这个问题上创建了几个主题,但我找不到可以应用于我的案例的解决方案。

我的问题是,当用户在我的页面上提交表单,并且浏览器停止时,一些用户尝试在处理请求时刷新页面并在数据库中插入两次行。在脚本中间有两个卷曲调用,可能需要几秒钟才能完成,这是导致延迟的原因。我相信通过刷新页面,他们打开一个具有相同会话详细信息的新连接并再次提交,但废弃的后端脚本仍在处理该过程。而最重要的(也是最糟糕的)是,表格会自行发布。

我们试图应用几个措施(擦除SESSION跟踪生成的会话变量等等)。我相信表单上的隐藏字段不是一个选项,因为进程脚本可能会被伪造的浏览器攻击。

我的建议是将进程部分从视图中分离出来并将其迁移到单独的脚本并通过Ajax调用它。在调用Ajax时,禁用提交按钮,提示用户在处理页面时不刷新页面。这种方式即使刷新页面也不会再次提交,到那时进程可以设置SESSION变量以防止重新提交。

您对此解决方案有何看法?

不要向我发布此类内容不好或过程不好的内容并更改此内容或因为我无法在整个系统构建过程中对此过程进行任何重大更改之上。

非常感谢。

////////////////////////////////////// /////////////////////////////////////

扩展:

  • 将自发布怪物脚本的流程部分迁移到Ajax脚本中。
  • 启动ajax后,我禁用了提交按钮并显示一个文本不刷新浏览器的微调器
  • 当在Ajax脚本中完成操作时,我设置了一个会话变量,指示该过程已经完成
  • 如果他们仍然刷新浏览器,表单数据将被清除,他们根本没有足够的时间再次填写表单数据,所以当他们再次提交表单时,会话变量已经设置并且按下了提交按钮会显示一条消息,然后重定向到确认页面。

到目前为止,似乎有一些测试运行正常。

你们对这个解决方案有什么看法?是否存在漏洞或安全隐患? (错误消息来自脚本通过Json)

3 个答案:

答案 0 :(得分:1)

好的,另一个去:

<?php
   session_start();
   $old_session_exists = false;
   while (isset($_SESSION['processing-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']])) {
      $old_session_exists = true;
      sleep(5);
   }

   if (!$old_session_exists) {
      // process your cURL and save output into another session variable
      $_SESSION['processing-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']] = 1;
      $_SESSION['result-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']] = cURL(...);

      // remove processing session
      unset($_SESSION['processing-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']]);
   }

   // return the result from session
   $ret = $_SESSION['result-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']];
   unset($_SESSION['result-'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']]);
   return / echo $ret;
?>

答案 1 :(得分:0)

gergiusz:

我对解决方案的看法将取决于您发送的内容(例如,使用经典方法,您不应该通过JS请求发送文件)。此外,使用Ajax会使应用程序依赖于启用JS,这会是一个问题吗?最后,即使小心,也可以伪造请求......

鉴于此,我的观点是“请,不要”。我认为这会增加不必要的复杂性。

虽然邪恶和肮脏,你试过发送到隐藏的框架吗?这是一种典型的解决方案,可以让您在提交表单后立即显示“请,等待消息”。和所有东西一样,它可以被伪造和破坏但是又一次,不是什么?。

答案 2 :(得分:0)

如何使用Asynchronous cURL