36

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

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

编辑:我知道令牌技术,这是我过去使用过的,这个问题或多或少是看我的方法是否符合你们其他优秀程序员使用的方法。

4

6 回答 6

31

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

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

于 2008-10-20T15:53:37.837 回答
10

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

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

于 2008-10-20T15:55:08.097 回答
9

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

于 2008-10-20T16:11:11.233 回答
3

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

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

于 2008-10-20T16:05:00.450 回答
0

I am having a similar problem. After reading this, I am thinking a token might be the way to go. This post shows a good example of implementation.

于 2014-04-01T20:20:20.473 回答
-6

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

于 2011-09-07T15:03:38.750 回答