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

时间:2008-10-20 15:51:21

标签: server-side

我们都知道旧的“禁用提交按钮”技巧,但处理多个提交服务器端的最佳方法是什么?我有一个绝对严重的应用程序,表单只能发送一次 - 它处理一张信用卡。我没有写出它现在是怎么回事,但作为一个快速修复,我提出了禁用提交技术,但是一些不耐烦的用户已经被禁用了两次。

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

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

6 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:8)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:0)

我遇到了类似的问题。读完之后,我在想一个令牌可能是要走的路。 This post显示了一个很好的实施示例。

答案 5 :(得分:-4)

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