【问题标题】:WCF / ASP.NET - protected against misuse such as DOSWCF / ASP.NET - 防止滥用,如 DOS
【发布时间】:2011-01-20 19:49:16
【问题描述】:

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

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

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

我的问题是 - 从概念层面来看,在确保页面可用的同时确保人机交互的最佳方式是什么。例如,在调用Ping() 并启动表单之前的验证码太具有侵入性,即使它可以有效地确保正确使用表单。另一方面,简单地允许Ping() 触发OnLoad 对于攻击来说风险太大。

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

最后 - 我也知道这种检查服务可用性的方法存在缺陷,因为无法保证在填写表格时服务将可用 - 但已决定使用此方法,因此请保留你的回答很到位。

感谢您的帮助和提前输入!

更新 1:

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

更新 2:

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

【问题讨论】:

    标签: c# javascript asp.net ajax wcf


    【解决方案1】:

    为什么不直接在按下提交按钮时调用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 有一些用于控制限制的有用设置,请查看 MaxConcurrentCallsMaxConcurrentInstancesMaxConcurrentSessions

    【讨论】:

    • 这只是扩展它;确保使用 AJAX,这样用户就不会丢失任何数据,如果他们有可用的 Html5,请提供在本地为他们保存,或者可能将其发送到备份服务器或其他东西。
    • 感谢乔希的意见。该表单已经通过许多 FaultExceptions 处理了任何问题。他们已经收到用户友好的错误消息。如果服务不可用,问题又回到了他们不想首先填写表格......
    • 他没有明确提到他正在使用 jquery
    • 在这种情况下,为什么不检查服务器端并只显示“抱歉,系统当前不可用”。而不是表格。
    • @josh:这是我的目标,我现在可以做到。问题是有人可以很容易地编写一个脚本来对页面发出一百万个 HTTP 请求,从而导致服务器端 Ping() 方法受到攻击。我确实喜欢您指出的油门控制属性。我会看看这些是否合适。到目前为止 +1...
    【解决方案2】:

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

    您可以查看 http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx - 向下滚动到“防止拒绝服务 (DOS) 攻击”作为示例

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • +1 马特。我喜欢你的回答,这很有意义,但我认为 Josh 使用内置 WCF 油门控制机制的回答在我的情况下更简单。
      猜你喜欢
      • 1970-01-01
      • 2011-03-07
      • 2012-12-28
      • 2011-12-19
      • 2013-03-30
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多