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

标签 c# javascript asp.net ajax wcf

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

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

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

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

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

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

感谢您提前提供的帮助和意见!

更新1:

针对下面 Josh 的回答 - 我应该澄清一下,提交的表单数据是敏感的,不能缓存在服务器上,也不能存储在本地以供以后在服务失败时提交。这就是为什么给用户预先提醒非常重要。我们在服务中遇到的问题不是间歇性的,因此如果 Ping() 返回 true,则用户很有可能在几分钟后提交表单时不会遇到问题。

更新2:

  • Ping() 方法目前是服务器端 C# 方法,而不是 JavaScript。
  • 面向公众的 WCF 服务受 IP 限制,仅允许来自公共(public) 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 有一些有用的设置来控制限制,请查看 MaxConcurrentCalls , MaxConcurrentInstances ,和 MaxConcurrentSessions

关于c# - WCF/ASP.NET - 防止滥用,例如 DOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751834/

相关文章:

Javascript 更改时间戳格式

javascript - 使用 CSS 或 JS 移动(动态)一个 div 吗?

c# - 如何将 IFormFile 放入 MVC6 中的 View 模型中

asp.net - 阻止下载特定文件

c# - 如何使用 iText7 和 C# 将文本添加到现有 pdf 而不覆盖内容?

c# - 在任务中抛出异常 - "await"vs Wait()

c# - 从普通 C# 开发人员到普通 Java 开发人员需要多长时间?

c# - 如何根据某些条件(本地报告)为 tablix 中的单元格指定文本颜色?

javascript - 在 Ext 中使用 XTemplate 和 SimpleStore

asp.net - "Access to the registry key ' 访问性能计数器时全局 ' is denied"