解决双重提交问题

JHa*_*ey1 25 web-applications web-frameworks double-submit-prevention

我想看看Web开发人员如何避免双重提交问题.基本上我对这个问题的理解如下:

当不耐烦的用户多次提交表单时会发生双重提交,从而导致问题.这个问题可以通过JavaScript(特别是jQuery脚本)来修复,这些脚本在提交表单后禁用了提交按钮 - 这样做的一个弱点就是客户端禁用了JavaScript.

还有服务器端检测方法.

所以我的问题是:

人们如何克服双重提交?什么是双重提交引起的问题的真实例子?任何Web应用程序框架都内置了双重提交工具吗?

Cia*_*her 17

现实生活情况:在投注网站上下注.用户双击并获得两次下注.不好!Javascript检查不足以阻止这种情况.

解:

  1. 使用呈现表单的服务器端脚本语言在表单中创建UUID/GUID隐藏输入.

  2. 在表单提交上,立即将其添加到名为UniqueSubmissions(例如)的数据库表中.然后继续处理.

  3. 如果在UniqueSubmissions表中找到,将拒绝具有相同UUID/GUID的每个后续请求.

这对我们有用.希望有助于回答您的问题!


Dea*_*mer 8

如果您正在使用Java服务器端脚本并使用struts 2,那么您可以参考此链接,该链接讨论使用令牌.

http://www.xinotes.org/notes/note/369/

当请求与令牌第一次一起提交时,应该生成一个令牌并保存在初始页面呈现的会话中,在struts动作中运行一个线程名称作为令牌ID的线程,并运行逻辑,无论客户端具有什么请求,当客户端再次提交相同的请求时,检查线程是否仍在运行(thread.getcurrentthread().中断)如果仍在运行,则发送客户端重定向503.

请看struts 2code的ExecuteAndWaitInterceptor,这与逻辑结合使用令牌有助于快速点击


Joe*_*oel 7

使用post-post-post或有时称为PRG(post/redirect/get)

简而言之,当用户发布表单时,您执行客户端重定向(在使用发布数据之后)到响应(成功)页面.

  • 这不会阻止快速双击问题 (11认同)
  • postirect-after-post模式很不错,但它并没有解决这个问题.问题是双击提交按钮的愚蠢用户或在页面加载之前重新提交表单的不耐烦用户.这两种情况都发生在应用后重定向模式之前. (2认同)

小智 5

一个真实的例子是这个答案发布两次;-).如果您不想依赖客户端的任何方面(javascript,甚至cookie),您可以计算提交数据的MD5哈希值,可能通过添加源IP和使用的浏览器等信息,并拒绝帖子具有相同的哈希值.