我们目前在我们的ASP.NET网站上托管了一个冗长的表单,该网站利用面向公众的WCF服务,通过许多其他门面服务等将信息通过SSL提交到我们的网络中。
我们遇到了服务链停机的一些问题,因此有些用户对完成冗长的表格感到非常沮丧,只是在服务未启动后才发现。因此,我们在表单上实现了一种ping功能,它将在表单启动之前ping服务,以确保服务正常运行。
如果在表单网页的Ping()
期间简单地调用OnLoad
方法,则可能会通过例如不断针对页面发出HTTP GET请求的脚本来进行DOS攻击。
我的问题是 - 从概念层面来看,确保人工与页面交互同时保持其可用性的最佳方法是什么。例如,调用Ping()
之前的CAPTCHA并且启动表单太过于干扰,即使它可以有效地确保正确使用表单。另一方面,简单地允许Ping()
解雇OnLoad
对攻击来说风险太大。
我考虑过的一个选项是为用户提供一个按钮,允许他们验证服务可用性并一次性启用表单。这至少可以在两者之间取得平衡。我要求您就如何最好地平衡这种方法提出意见。任何基于asp.net,c#或javascript / ajax的答案都可以。
最后 - 我也知道这种检查服务可用性的方法存在缺陷,因为无法保证在填写表单时服务可用 - 但是已经决定使用这种方法所以请保持你的答案。
感谢您的帮助和提前输入!
更新1:
回应Josh在下面的回答 - 我应该澄清提交的表单数据是敏感的,如果服务失败,则不能在服务器上缓存或存储在本地以便以后提交。这就是为用户提供先发制人的非常重要的原因。我们对这些服务所遇到的问题不是断断续续的,所以如果Ping()
恢复正常,那么几分钟后用户很可能不会遇到提交表单的问题。
更新2:
Ping()
方法目前是服务器端c#方法,而不是javascript。答案 0 :(得分:3)
为什么不在按下提交按钮时调用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;
});
不幸的是,任何面向公众的网络服务都具有较低的通话费用但处理成本较高,在没有某种限制的情况下容易受到DOS攻击。
值得庆幸的是,WCF有一些控制限制的有用设置,请查看MaxConcurrentCalls,MaxConcurrentInstances和MaxConcurrentSessions
答案 1 :(得分:1)
在客户端确实没有很好的解决方案来防止DOS攻击 - 我可以使用你的Ping js方法创建一个脚本,它会在一个循环中调用它一百万次。您可以在服务器端阻止它,通过跟踪每秒的呼叫形成相同的ip / session / user / otherclient端标识符。如果每秒呼叫次数超过某个合理限制,则暂时禁止该客户端。
您可以查看http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx - 向下滚动到“防止拒绝服务(DOS)攻击”的示例
答案 2 :(得分:1)
在页面加载和提交按钮之前调用您的函数。如果您正在使用任何日志记录,则可以插入此特定aspx页面视图的日志表中,并包含访问者的IP地址。设置一个阈值,如果IP发出的请求多于正确使用所需的请求,则设置某种类型的人工验证项。