防止双重HTTP POST

20 post

我已经为注册活动做了一个小应用程序.用户输入他们的数据并单击"登录".

现在有时人们在数据库中是双倍的,完全相同的数据相互之后非常快地插入2次.这只能意味着有人点击了按钮两次,这导致了两个帖子发生.

这是常见的网络问题,因为信用卡应用和论坛应用经常说:"点击一次就够了!".

我猜您可以通过检查完全相同的数据来查看帖子是否唯一,但我想知道是否还有其他方法.

这个过程不计入ASP.NET webforms,因为POST并不重要.

Ric*_*ams 22

虽然JavaScript解决方案可以在单击后禁用提交按钮,但这对那些禁用了JavaScript的人没有影响.在添加之前,您应该始终在没有JavaScript的情况下正常工作,否则没有意义,因为用户仍然可以通过禁用JavaScript来绕过检查.

如果动态生成表单所在的页面,则可以添加包含某种序列号,散列或任何唯一的隐藏字段.然后,您将进行一些服务器端验证,以检查具有该唯一值的请求是否已经进入.当用户提交表单时,将根据"已使用"值列表检查唯一值.如果它存在于列表中,则它是一个欺骗请求,可以被丢弃.如果它不存在,则将其添加到列表中并正常处理.只要您确保该值是唯一的,这就保证了相同的表单无法提交两次.

当然,如果表单所在的页面不是动态生成的,那么您需要在服务器端以硬盘方式执行此操作,以检查是否尚未提交相同的信息.

  • 你解决问题的方法很好.但是客户可以查看隐藏的字段,并且可以由他编辑以破坏我们的应用程序,这可能会再次接受双重形式.我正在寻找一个完全面向服务器的解决方案. (3认同)

Jon*_*eet 20

到目前为止,大多数答案都是客户端的.在服务器端,您可以在第一次生成表单时生成带有GUID的隐藏字段,然后在收到帖子时将该GUID记录为提交的表单.在进行任何更多处理之前检查它.

  • (实际上,只是想添加我个人更喜欢将该键放在查询字符串而不是创建隐藏字段) (2认同)

che*_*rit 5

每当从服务器请求页面时,生成一个唯一的 requestToken ,将其保存在服务器端,将状态标记为“未处理”并将其与当前请求的页面一起传递。现在,每当发生页面提交时,从“POST”数据中获取 requestToken 并检查状态并保存数据或采取其他操作。

大多数银行应用程序都使用此技术来防止重复“POST”。因此,这是一种经过时间考验且可靠的防止重复提交的方法。