我们目前在 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/