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

Ben*_*n M 3 forms gwt double-submit-prevention

我正在构建一个包含大量表单的GWT应用程序.我正在使用gwt-platform及其调度模块.

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

我想到了这样的事情:

  1. 应用程序加载时,服务器会向客户端提供一些生成的令牌
  2. 服务器将令牌存储在HTTPSession中
  3. 当客户提交表单时,它将从表单(1.)发送令牌
  4. 服务器检查HTTPSession中是否发送了令牌==令牌
  5. 在客户的答案中,它将发送一个新令牌

将令牌存储在HTTPSession中是否安全?或者我应该在服务器上创建一个从SESSION_ID映射到生成令牌的HashMap?

或者也许已经在GWT或gwt-platform或其他地方实现了这一点?

谢谢

Chr*_*her 5

首先要问自己的问题是:你想避免哪种问题?

  1. 用户不小心(或沮丧地......)点击两次按钮.
  2. 只有一次可用的资源(如飞机中某个座位的预订)被消耗两次.

不要只说"我想避免两者".即使你这样做,你也必须分别处理这两个问题.

问题1

这在客户端更好地解决(例如,一旦点击它就禁用按钮).

它也可以在服务器端解决(通过检查序列号或令牌或者内容的哈希码,......),但我真的没有看到这一点.如果用户确实想要提交两次(例如,通过操纵JavaScript以使按钮不被禁用),那么就让他们:问题1与安全无关.

问题2

这必须(在非常特定的情况下除外)在服务器端解决.它主要是关于安全性.但是当你想到它时,双重提交预防无法解决这个问题!为什么不?

让我们看一下我们的例子:飞机上的座位必须只保留一次.这可以通过多种方式违反:

  • 通过双重提交.
  • 由同一个用户同时提交,例如来自不同的浏览器窗口.
  • 通过mutliple用户尝试同时保留.

解决问题的干净方法是通过预留座位来原子地检查座椅的可用性.如果违规是由双重提交造成的,那么这并不重要(问题1涵盖了意外的双重提交).

......和问题3

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

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

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