如何处理多个提交服务器端

我们都知道老的“禁用提交button”技巧,但处理多个提交服务器端的最佳方法是什么? 我有一个应用程序,绝对重要的是表单只能发送一次 – 它处理信用卡。 我没有写现在是怎么回事,但作为一个快速解决scheme,我抛出了禁用提交技术,但一些禁用JavaScript的不耐烦的用户仍然收取两次费用。

那么,有什么方法可以避免呢? 我可以想到几个 – 我过去曾经使用过一些 – 但是我想看看是否有任何有关如何解决这个问题的“最佳实践”。 我正在使用PHP,但我更感兴趣的概念。

编辑:我意识到令牌技术,这是我以前使用过的,这个问题或多或less是看我的方法是否符合其他程序员使用的其他方法。

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

令牌可以像递增整数一样简单,存储在隐藏文本字段中,也可以对其进行encryption以提高安全性。 通过在创build页面时生成令牌,对其进行encryption,然后确认令牌已生成且尚未处理,可以使此function更加健壮。

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

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

您也可以简单地testing是否在最后一分钟(或第二次,取决于您的服务器的延迟)进行了相同的事务。 大多数人不使用同一张卡在一分钟内购买两本相同的书籍(或其他)。 如果您在最后一分钟保持信用卡付款的caching,并检查您要制作的信用卡是否与您刚刚完成的信用卡完全相同(卡号相同,金额相同),则可能会发现重复。

我不会依赖任何客户端这一点。 为什么不给客户端提交提交button之前,为这个事务服务器端生成一个唯一的ID? 客户端然后必须提交这个令牌,并且你检查服务器端每个令牌提交一次。

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

我有类似的问题。 看完这个之后,我想一个令牌可能是要走的路。 这篇文章展示了一个很好的例子。

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