C# WCF/ASP.NET-防止滥用,如DOS

C# WCF/ASP.NET-防止滥用,如DOS,c#,javascript,asp.net,ajax,wcf,C#,Javascript,Asp.net,Ajax,Wcf,我们目前在我们的ASP.NET网站上托管了一个很长的表单,该表单使用面向公众的facade WCF服务,通过SSL通过许多其他facade服务等将信息提交到我们的网络中 我们在服务链上遇到了一些停机问题,正因为如此,一些用户非常沮丧,因为他们填写了冗长的表单,但在服务未启动后才发现。因此,我们在表单上实现了一种ping功能,它将在表单启动之前ping服务,以确保服务启动 如果在表单网页的OnLoad期间仅调用Ping()方法,则可能会通过脚本(例如,不断对页面发出HTTP GET请求)进行DOS

我们目前在我们的ASP.NET网站上托管了一个很长的表单,该表单使用面向公众的facade WCF服务,通过SSL通过许多其他facade服务等将信息提交到我们的网络中

我们在服务链上遇到了一些停机问题,正因为如此,一些用户非常沮丧,因为他们填写了冗长的表单,但在服务未启动后才发现。因此,我们在表单上实现了一种ping功能,它将在表单启动之前ping服务,以确保服务启动

如果在表单网页的
OnLoad
期间仅调用
Ping()
方法,则可能会通过脚本(例如,不断对页面发出HTTP GET请求)进行DOS攻击

我的问题是——从概念层面上讲,在保持页面可用性的同时,确保人与页面交互的最佳方式是什么。例如,在调用
Ping()
并启动表单之前的验证码太过侵入性,即使它可以有效地确保表单的正确使用。另一方面,简单地允许
Ping()

我考虑过的一个选项是为用户提供一个按钮,允许他们一次验证服务可用性并启用表单。这至少是两者之间的平衡。我想征求你对如何最好地平衡这种方法的想法的意见。任何基于asp.net、c#或javascript/ajax的答案都可以

最后——我也知道这种检查服务可用性的方法存在缺陷,因为无法保证在填写表格时服务可用——但已经决定使用这种方法,因此请保留您的答案

提前感谢您的帮助和输入

更新1:

作为对Josh下面回答的回应,我应该澄清,提交的表单数据是敏感的,不能缓存在服务器上,也不能存储在本地,以便在服务失败时稍后提交。这就是为什么给用户一个先发制人的头脑是非常重要的。我们遇到的服务问题不是间歇性的,因此如果
Ping()
恢复为真,用户很有可能在几分钟后提交表单时不会遇到问题

更新2:

  • Ping()
    方法目前是一种服务器端c#方法,而不是javascript
  • 面向公众的WCF服务受IP限制,仅允许来自公共web服务器的请求

当按下提交按钮时,为什么不调用
Ping()
,如果服务没有响应,则不要提交表单并显示错误

在jQuery中是这样的。这假设
Ping()
返回
true
如果服务启动,则返回
false
否则:

$('#myformid').submit(function() {
  var svcUp = Ping();

  if(!svcUp)
      alert("Sorry, there was an error submitting, please try again.");

  return svcUp;
});
不幸的是,任何调用成本低但处理成本高的面向公众的web服务在没有某种限制的情况下都容易受到DOS攻击


谢天谢地,WCF提供了一些有用的设置来控制节流,请看一下,当按下提交按钮时,为什么不调用
Ping()
,如果服务没有响应,则不要提交表单并显示错误

在jQuery中是这样的。这假设
Ping()
返回
true
如果服务启动,则返回
false
否则:

$('#myformid').submit(function() {
  var svcUp = Ping();

  if(!svcUp)
      alert("Sorry, there was an error submitting, please try again.");

  return svcUp;
});
不幸的是,任何调用成本低但处理成本高的面向公众的web服务在没有某种限制的情况下都容易受到DOS攻击


谢天谢地,WCF有一些有用的设置来控制节流,请看一下,客户端上确实没有很好的解决方案来防止DOS攻击-我可以使用Ping js方法创建一个脚本,在循环中调用它一百万次。但是,您可以在服务器端通过每秒跟踪来自相同ip/session/user/otherclient-side标识符的呼叫来防止这种情况。如果每秒的呼叫数超过某个合理的限制,则暂时禁止该客户端


您可以查看-向下滚动以“防止拒绝服务(DOS)攻击”为例

在客户端上确实没有很好的解决方案来防止DOS攻击-我可以使用Ping js方法创建一个脚本,在循环中调用它一百万次。但是,您可以在服务器端通过每秒跟踪来自相同ip/session/user/otherclient-side标识符的呼叫来防止这种情况。如果每秒的呼叫数超过某个合理的限制,则暂时禁止该客户端


您可以查看-向下滚动以“防止拒绝服务(DOS)攻击”为例

在页面加载和提交按钮之前调用您的函数。如果您有任何正在使用的日志记录,您可以为这个特定的aspx页面视图插入日志表,并包括访问者的IP地址。设置一个阈值,如果IP发出的请求超过了正确使用所需的请求,则设置某种类型的人工验证项。

在页面加载时并在“提交”按钮之前调用您的函数。如果您有任何正在使用的日志记录,您可以为这个特定的aspx页面视图插入日志表,并包括访问者的IP地址。设置一个阈值,如果IP发出的请求超过了正确使用所需的请求数,则设置某种类型的人工验证项。

此项,但在此基础上进行扩展;请确保使用AJAX,这样用户就不会丢失任何数据,如果他们有可用的Html5,请在本地为他们保存数据,或者可能将其发送到备份服务器或其他地方。感谢Josh的输入。表单已经通过一些FaultException处理了任何问题。他们已经得到了一个用户友好的错误消息