【问题标题】:How to handle multiple submissions server-side如何在服务器端处理多个提交
【发布时间】:2010-09-18 03:33:54
【问题描述】:

我们都知道古老的“禁用提交按钮”技巧,但是在服务器端处理多个提交的最佳方法是什么?我有一个应用程序,其中一个表单只发送一次是绝对关键 - 它处理信用卡。我没有写现在的情况,但作为一种快速修复,我使用了提交时禁用技术,但是一些禁用 javascript 的不耐烦的用户仍然会被收取两次费用。

那么,有什么方法可以避免这种情况呢?我能想到一些——我过去使用过一些——但我想看看是否有任何“最佳实践”来解决这个问题。我正在使用 PHP,但我对概念更感兴趣。

编辑:我知道令牌技术,这是我过去使用的,这个问题或多或少是看我的方法是否与你们其他人一致程序员很好用。

【问题讨论】:

  • 大家一致认为这是我们其他优秀程序员(还有我!)使用的方法 :-) 这是一种强大而稳健的技术,在大多数应用程序中都具有安全优势。跨度>
  • 这类似于问题stackoverflow.com/questions/130337/…你是否阻止用户在网站上多次发布数据。

标签: server-side


【解决方案1】:

一种真正有效的方法是随请求一起提交令牌,并保留已使用令牌的列表。如果令牌无效,或者令牌已被处理,则中止。

令牌可以像递增的整数一样简单,存储在隐藏的文本字段中,或者您可以对其进行加密以提高安全性。通过在创建页面时生成令牌、对其进行加密、然后确认令牌已生成且尚未处理,可以使此功能更加强大。

【讨论】:

  • 如何处理用户按下后退按钮(大多数浏览器不会重新请求)、更改表单中的数据并再次提交相同的令牌?
  • @jayrdub 我知道这个 q 是给 RB 的,但我简单地给出一个错误,说会话已过期,然后将他们带回表单,加载表单字段并保存在会话中以减少用户的不便
  • 我看到有人建议将令牌存储在会话中,然后将令牌与其进行比较,如果相等则未设置会话并继续请求,否则上船。我认为这仍然容易受到提高条件的影响,对吧?您是否建议将“已用令牌列表”存储在数据库中并通过交易检查是否存在?
【解决方案2】:

在隐藏的表单字段中包含一个随机的唯一标记。然后在后端,你可以检查它是否之前提交过。

这通常是一个好主意,因为它还可以帮助您防御 XSS 攻击。

【讨论】:

  • 这就是我在我的网站上所做的; JavaScript 用一个随机的 32 个字符的字符串填充一个隐藏字段,我检查它是否已经提交过。这也适用于禁用 JS 时,因为我检查该字段是否为空。但是,是什么阻止了某人检查元素并粘贴 32 个字符的字符串?
【解决方案3】:

您也可以简单地测试是否在最后一分钟(或一秒钟,取决于您的服务器的延迟)内进行了相同的事务。大多数人不会在一分钟内使用同一张卡购买两本相同的书(或其他书)。如果您在最后一分钟保留信用卡付款的缓存,并检查您将要付款的付款是否与您刚刚付款的付款相同(相同的卡号,相同的金额),您很可能会发现重复付款.

【讨论】:

    【解决方案4】:

    我不会为此依赖任何客户端。为什么不在向客户端显示提交按钮之前为此事务服务器端生成一个唯一 ID?然后客户端必须提交此令牌,然后您检查服务器端是否每个令牌都提交一次。

    正如其他人所说,令牌可以是递增整数(+ 用户名)或 GUID。

    【讨论】:

      【解决方案5】:

      我也有类似的问题。读完这篇文章后,我认为令牌可能是要走的路。 This post 展示了一个很好的实现示例。

      【讨论】:

        【解决方案6】:

        无需生成唯一令牌和所有爵士乐。表单验证通过后,只需将访问者重定向到另一个页面,上面写着“您的信用卡正在处理中”。如果访问者重新加载页面,他们正在重新加载重定向页面,而不是 POST 提交。

        【讨论】:

        • 错了。如果我疯狂地点击提交按钮,你会收到多个提交的 POST 请求。
        • 您是否考虑过在有人点击提交按钮但在提交表单之前禁用它?这将使某人无法多次实际单击该按钮。他们能做到这一点的唯一方法是,如果他们故意使用 Chrome 开发工具或 Firebug 来更改客户端 HTML 和脚本,以便多次提交。典型的用户不会有这样做的知识或愿望。
        • 客户端不足以防止严重错误,例如向客户端收费两次(或更多)。如果上次部署的 js 文件版本有错误,并且按钮没有被禁用,因为由于错误没有执行 javascript,该怎么办?那些禁用 javascript 的人呢,并不总是自愿选择,比如视障人士(请参阅 stackoverflow.com/a/2905104/135494)。 “所有爵士乐”对于普通网站来说可能已经足够了,但 OP 表示“表单只发送一次是绝对关键的”,如果没有“爵士乐”,那就不是够了。
        • PGR 模式可以防止页面重新加载,但不能防止双击。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 2010-11-27
        • 1970-01-01
        • 2017-04-15
        相关资源
        最近更新 更多