Ben*_*n M 3 forms gwt double-submit-prevention
我正在构建一个包含大量表单的GWT应用程序.我正在使用gwt-platform及其调度模块.
我想到的下一步是防止双重提交服务器端.问题是我不知道该怎么做......
我想到了这样的事情:
将令牌存储在HTTPSession中是否安全?或者我应该在服务器上创建一个从SESSION_ID映射到生成令牌的HashMap?
或者也许已经在GWT或gwt-platform或其他地方实现了这一点?
谢谢
首先要问自己的问题是:你想避免哪种问题?
不要只说"我想避免两者".即使你这样做,你也必须分别处理这两个问题.
这在客户端更好地解决(例如,一旦点击它就禁用按钮).
它也可以在服务器端解决(通过检查序列号或令牌或者内容的哈希码,......),但我真的没有看到这一点.如果用户确实想要提交两次(例如,通过操纵JavaScript以使按钮不被禁用),那么就让他们:问题1与安全无关.
这必须(在非常特定的情况下除外)在服务器端解决.它主要是关于安全性.但是当你想到它时,双重提交预防无法解决这个问题!为什么不?
让我们看一下我们的例子:飞机上的座位必须只保留一次.这可以通过多种方式违反:
解决问题的干净方法是通过预留座位来原子地检查座椅的可用性.如果违规是由双重提交造成的,那么这并不重要(问题1涵盖了意外的双重提交).
如果您已经实现了一些自动重新提交机制,那么您可能还会遇到第三种问题:
假设用户想要将商品添加到他的购物车中.客户端提交,并且在超时之前没有收到服务器的响应.所以它会自动再次发送.然而,服务器接收这两个消息,并尝试处理它们 - 因此它将项目两次添加到购物车.
在我看来,避免这种情况的最佳解决方案通常不是使用诸如"将一个项目添加到购物车"之类的操作,而是"将项目的目标数量设置为1".同样,您也可以使用序列号等.