C# WCF/ASP.NET-防止滥用,如DOS
我们目前在我们的ASP.NET网站上托管了一个很长的表单,该表单使用面向公众的facade WCF服务,通过SSL通过许多其他facade服务等将信息提交到我们的网络中 我们在服务链上遇到了一些停机问题,正因为如此,一些用户非常沮丧,因为他们填写了冗长的表单,但在服务未启动后才发现。因此,我们在表单上实现了一种ping功能,它将在表单启动之前ping服务,以确保服务启动 如果在表单网页的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
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处理了任何问题。他们已经得到了一个用户友好的错误消息