Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 如何在GWT中实现服务器端双重提交预防?_Forms_Gwt_Double Submit Prevention - Fatal编程技术网

Forms 如何在GWT中实现服务器端双重提交预防?

Forms 如何在GWT中实现服务器端双重提交预防?,forms,gwt,double-submit-prevention,Forms,Gwt,Double Submit Prevention,我正在用大量的表单构建一个GWT应用程序。我正在使用gwt平台及其调度模块 我认为下一步是防止服务器端的双重提交。问题是我不知道该怎么做 我想到了这样的事情: 当应用程序加载时,服务器向客户端提供一些生成的令牌 服务器将令牌存储在HTTPSession中 当客户端提交表单时,它将从(1.)随表单一起发送令牌 服务器检查HTTPSession内发送的令牌是否==令牌 在对客户端的应答中,它将发送一个新令牌 将令牌存储在HTTPSession中是否安全?或者我应该在服务器上创建一个HashMap,将

我正在用大量的表单构建一个GWT应用程序。我正在使用gwt平台及其调度模块

我认为下一步是防止服务器端的双重提交。问题是我不知道该怎么做

我想到了这样的事情:

  • 当应用程序加载时,服务器向客户端提供一些生成的令牌
  • 服务器将令牌存储在HTTPSession中
  • 当客户端提交表单时,它将从(1.)随表单一起发送令牌
  • 服务器检查HTTPSession内发送的令牌是否==令牌
  • 在对客户端的应答中,它将发送一个新令牌
  • 将令牌存储在HTTPSession中是否安全?或者我应该在服务器上创建一个HashMap,将会话_ID映射到生成的令牌

    或者可能已经在GWT或GWT平台或其他地方实现了这一点


    谢谢

    你首先要问自己的问题是:你想避免什么样的问题

  • 用户意外(或出于沮丧,…)单击按钮两次
  • 只有一次可用的资源(如飞机上某个座位的预订)被消耗两次
  • 不要只说“我想避免两者”。即使你这样做了,你也必须分别处理这两个问题

    问题1 这最好在客户端解决(例如,单击按钮后禁用按钮)

    它也可以在服务器端解决(通过检查序列号或令牌,或者可能是内容的哈希代码,…),但我并不真正理解这一点。如果用户真的想提交两次(例如,通过操纵JavaScript使按钮不会被禁用),那么就让他们提交:问题1与安全性无关

    问题2 这必须在服务器端解决(非常特殊的情况除外)。这主要是关于安全。但仔细想想,这个问题不能通过双重预防来解决!为什么不呢

    让我们看看我们的例子:飞机上的座位只能预定一次。这可能以多种方式违反:

    • 通过双重提交
    • 由同一用户同时提交,例如从不同的浏览器窗口提交
    • 多个用户同时尝试预订
    解决此问题的干净方法是通过保留座椅来自动检查座椅的可用性。如果违规是由双重提交引起的(问题1涵盖了意外的双重提交),这其实并不重要

    ... 问题3 如果您已经实现了一些自动重新提交机制,那么您可能还会遇到第三类问题:

    假设用户想要将一个项目添加到他的购物车中。客户端提交,并且在超时之前没有收到来自服务器的响应。所以它会自动再次发送。但是,服务器会同时接收这两条消息,并尝试处理这两条消息,因此它会将该项目添加到购物车中两次


    在我看来,避免这种情况的最佳解决方案通常不是使用“向购物车添加一个项目”之类的操作,而是“将项目的目标计数设置为1”。同样,您也可以使用序列号等。

    谢谢您的回答。问题1非常简单和直接。我想防止恶意用户,例如,试图用大量条目淹没我的数据库。这些家伙使用firebug或其他任何东西来修改原始JavaScript代码。因此,我们的想法是,每个表单提交都需要一个令牌,服务器可以检查。@Benjamin:我明白你的意思-是的,可以使用令牌,并将其存储在HTTPSession中(我不会将密码存储在那里,因为会话内容可以写入磁盘,但只要不围绕这些令牌构建安全性,这应该足够安全)。但是,我不知道这是否真的能阻止坏人涌入您的数据库:他们可以简单地要求服务器提供更多令牌。最后,这只是速率限制,但您可以通过直接对每个用户的保存操作进行速率限制来更容易地实现这一点。谢谢:)对于“每个用户”,您是指IP还是会话ID?因为目前将有一些表单,用户可以在不登录的情况下提交。关于HTTPSession,我还有一些问题:它到底是如何工作的?客户端是否会在每次请求时都将其内容发送到服务器?@Benjamin:好吧,如果用户可以在不登录的情况下提交,那么你可能会受到IP的限制-这并不理想,但你没有任何实际的选择HTTPSessions是如何工作的?您应该搜索主题,但要快速:不,他们不来回发送整个数据,他们只发送一个id(通常称为JSESSIONID,通常使用cookie),数据存储在服务器上(通常在服务器重新启动后仍然有效,具体取决于配置)。我强烈建议使用一些网络工具或插件(例如Firebug)来检查哪些数据实际上是通过网络发送的。