【问题标题】:ASP.NET MVC 3.0 - User Hammering Submit ButtonASP.NET MVC 3.0 - 用户锤击提交按钮
【发布时间】:2011-07-11 12:05:09
【问题描述】:

即使使用 Post/Redirect/Get 方法,并且在单击按钮后包含 javascript 来禁用按钮,我还是遇到了用户能够快速敲击提交按钮并在服务器之前获取多个表单帖子的问题侧面验证可以阻止它。

有没有办法阻止这种情况?我什至尝试过这种方法:how to implment click-once submit button in asp.net mvc 2?

我已经尝试用 jquery blockUI 彻底阻止 UI。我有两个客户端服务器端验证,它们工作得很好——但是用户在一秒钟内粉碎提交按钮二十次似乎一直在破坏它。

【问题讨论】:

  • 使用 javascript 阻止 UI 是最可靠的处理方法。在我看来,你已经做了你能做的一切。这是真正的用户还是点击提交按钮的测试人员?
  • 你的post方法是幂等的吗?
  • 我不明白你的意思。我的 post 方法与我最初的 view 方法不同,是的。我有一个Create,然后是一个[HttpPost]Create 方法。

标签: asp.net-mvc-3


【解决方案1】:

使用 javascript 连接 onclick 事件以禁用按钮。

如果您已经这样做并且仍然可以收到多个表单帖子,那么问题是单击按钮和禁用按钮之间的延迟,并且您必须在此延迟期间多次提交表单。

要解决此问题,请先让onclick 事件调用stopPropagation() 以停止提交事件。然后验证表单是否处于提交阻止状态。您可以通过创建一个页面范围的 JavaScript 变量来实现这一点,该变量具有一个布尔值,如 can_submit。在提交表单之前测试 can_submit 是否为真。当按钮被禁用时设置can_submit = false,这样即使按钮被禁用的速度不够快,如果该值已经设置为false,表单也不会提交。

【讨论】:

  • 这只有在用户启用了 javascript 时才有效。我实现了它,很快我的测试人员就可以通过他们的手机浏览器绕过它。
  • 您可以在您的 HttpApplication 上创建一个 HttpContext 输入队列并测试重复的连续发布请求。取消那些不应该通过的。
  • 这听起来像是一个聪明的方法,知道我会从哪里开始做这样的事情吗?我从来没有听说过这样做。
  • 是的。有多种方法可以做到这一点。由于您使用的是 MVC,我认为最简单的方法是实现自定义 IRouteHandler。您可以继承 MvcRouteHandler。您可以将您的逻辑放在 GetHttpHandler 方法的覆盖中。如果是重复请求,则只返回一个不执行任何操作的 HttpHandler,否则将调用推迟到 base.GetHttpHandler
  • 我如何判断它是否是重复请求?我以前从未处理过 RouteHandler 类。
【解决方案2】:

在大多数情况下,我会说这不值得修复 - 如果用户要做一些愚蠢的事情,比如点击提交 20 次,他们应该会收到错误。

对此唯一真正的解决方法是将您的操作设置为仅接受一次相同的表单 - 添加一个隐藏字段,该字段在加载表单时设置为随机值。发布表单后,将该值临时保存在某处,如果它已经存在,则您有一个重复的请求,不应该做任何事情。

【讨论】:

  • 我不希望用户意外地这样做,我希望它会更加恶意。需要明确的是,这不是“单击按钮,不耐烦,再次单击”的情况,这是“c-c-c-c-c-c-c-c-c-c-c-c-c-c-c--cc--c-c-click!”的情况。从一开始。
  • 让我烦恼的是,这在其他形式上没有发生,但我没有做任何不同的事情。这个表单唯一不同的是它只有一个表单域。但是,没有人在Register 表单上看到过这种情况。我不知道,这似乎是一般形式的一个非常明显的问题,令我惊讶的是,经过这么多年,我现在才遇到它。我必须假设我做错了什么。
  • 您是否能够自己重现该问题,或者这只是您在日志中看到的内容?如果是故意的,JavaScript 和标准验证将无济于事,因为每个请求上的值都是有效的,并且可以关闭 JavaScript。
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2016-08-02
  • 2013-05-02
  • 2014-07-15
  • 1970-01-01
相关资源
最近更新 更多