【问题标题】:Prevent multiple POST in asp.net mvc application防止asp.net mvc应用程序中的多个POST
【发布时间】:2011-05-11 16:48:34
【问题描述】:

如果用户不断点击提交按钮,我如何防止用户多次向操作发布相同的数据?

我知道在 php 中有一种方法可以防止这种多次提交,但我没有看到任何用于 asp.net mvc 的方法。有吗?

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

您可以使用 javascript 禁用提交按钮。 jQuery 示例:

$(function() {
    $('form').submit(function() {
        $('#idofsubmitbutton').attr('disabled', 'disabled');
    });
});

但是请注意,这可能不是 100% 可靠的,例如用户可能禁用了 javascript,甚至更糟:他可能有恶意并自动执行 HTTP POST 请求。

【讨论】:

  • 这总是一件好事,但也不是万无一失的,尤其是如果您的用户是恶意的。
  • @罗伯特哈维,当然。我应该在回答中提到这一点。
  • 那么我应该为整个网站的所有表单都设置这个通用格式吗?
  • @Lol 编码器,是的,您可以对所有调用修改服务器状态的操作的表单执行此操作。
【解决方案2】:

您正在寻找Post-Redirect-Get Strategy

禁用提交按钮不会阻止 F5 刷新。

【讨论】:

  • 虽然 PRG 模式很好并且应该使用,但如果其中的 P 操作需要时间(通常是这种情况),用户可以再次单击提交按钮并发起第二次调用此操作与第一个操作具有相同的数据。
  • 我们同时使用 PRG 和 disable 方法来避免这个问题,前提是 javascript 没有被禁用
【解决方案3】:

最佳实践是实现 PRG (http://en.wikipedia.org/wiki/Post/Redirect/Get) 模式,我在 aspnet mvc http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx 上有一篇关于此主题的旧帖子@ 检查 #13。

【讨论】:

  • 虽然 PRG 模式很好并且应该使用,但如果其中的 P 操作需要时间(通常是这种情况),用户可以再次单击提交按钮并启动第二次使用与第一个相同的数据调用此操作。
【解决方案4】:

这是this question 的副本,但我在这里发布我的答案以方便参考...

PRG 模式不会阻止这一点,因为其中的 P 动作需要时间(通常是这种情况)并且用户可以再次提交表单(通过单击或浏览器刷新),这将导致 PRG 模式“失败”。

请注意,恶意用户还可以通过快速连续运行多个 http 帖子来绕过您的所有客户端措施。

上述所有问题的解决方案是使用以下方法检查服务器端的重复提交,如我本人所述,here

我引用:

“如果您在表单中使用隐藏的防伪令牌(当您 应该),您可以在首次提交时缓存防伪令牌并 如果需要,从缓存中删除令牌,或使缓存条目过期 在设定的时间后。”

然后,您将能够根据缓存检查每个请求 特定表单是否已提交,如果已提交则拒绝。”

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多