0

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

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

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

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

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

不要向我发布这样的事情是坏的或对过程不好的事情并改变这个或那个,因为我无法在整个系统建立在它之上的过程中做出任何重大改变。

非常感谢。

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

扩大:

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

到目前为止,经过几次测试运行,它似乎运行良好。

大家觉得这个解决方案怎么样?是否存在任何漏洞或安全隐患?(错误消息来自脚本通过 Json)

4

3 回答 3

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;
?>
于 2012-08-22T11:41:05.303 回答
0

格吉乌斯:

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

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

虽然邪恶肮脏,但您是否尝试过发送到隐藏的框架?这是一个典型的解决方案,允许您在提交表单后立即显示“请稍候消息”。与所有事物一样,它可以被伪造和破坏,但话又说回来,什么不是?

于 2012-08-22T10:01:54.883 回答
0

使用异步 cURL怎么样?

于 2012-08-22T10:08:05.067 回答