几个月前,我们发生了一次主要的SharePoint中断,因为用户以使Enterbutton被无限期按下的方式楔住了他们的键盘。 用户在自定义的人员search页面上,同一用户的数百个POST被asynchronous提交,从而使服务器超载。
因为我在一个大型组织工作,我正在寻找一个更全面的方法来防止这种情况发生。
有没有一种方法可以防止一个普通用户在短时间内在IIS内提交多个Web表单?
我知道我们可以编写JavaScript来禁用单击button后,但我们希望能够防止出现类似的可能性可能存在的其他网页上发生此问题。
更新 :它看起来在源代码,JavaScript是执行document.location = url,每当键代码13(回车)被按下。 再次,我们可以在这个位置编写JS来防止这种情况,但是我们也希望能够更普遍地防范这种问题…最好是在IIS级别。
对此的一个select是使用像http://www.iis.net/downloads/microsoft/dynamic-ip-restrictions这样的速率限制,可以设置阻止有问题的IP一段时间。
当然,在把类似的东西放到生产环境中之前,你可能希望将典型的请求/秒/ IP作为基准,但是这应该可以防止单个用户再次执行类似的操作。
如果这个问题仅仅是为了避免由于并发请求的数量而产生的影响,那么IIS 7是一个dynamicIP限制的附加组件。 (此function现在内置于IIS8)。 可以将其configuration为仅限日志模式,以确定在启用该function之前会有什么影响。
http://www.iis.net/downloads/microsoft/dynamic-ip-restrictions

应用程序级别应提交多个表单提交。 使用母版页实现起来非常简单。 在母版页中的以下jquery为所有的子内容页面的技巧:
$("form").submit(function () { $(":submit", this).attr("disabled", "disabled"); });
另一个值得采用的好做法是:Post / Redirect / Get
您可以编写一个全局级别的IIS模块,并检查在相同的时间内是否来自同一用户的相同请求。 那么你可以决定是否允许请求继续。
class CGlobalTestFilterModule:public CGlobalModule { public: GLOBAL_NOTIFICATION_STATUS OnGlobalPreBeginRequest(IN IPreBeginRequestProvider * pProvider) { ... } ... }
这里是一个很好的指导,以实施IIS模块: http : //www.iis.net/learn/develop/runtime-extensibility/develop-a-native-cc-module-for-iis你可以select托pipe模块,如果你更多熟悉.NET