我正在开发一个 asp.net MVC web 应用程序,客户要求我们尽最大努力使它尽可能地抵御拒绝服务攻击。他们担心网站可能会收到恶意的大量请求,目的是减慢/关闭网站。
我已经与产品所有者讨论过这个问题,因为它确实超出了实际 Web 应用程序的职权范围。我认为监控流量和响应恶意请求是托管/网络团队的责任。
但是他们坚持认为应用程序应该内置一些预防措施。但他们不想实现 CAPTCHA。
有人建议我们限制在给定时间范围内可以为 session 提出的请求数量。我在想做这样的事情 Best way to implement request throttling in ASP.NET MVC?但是使用 session ID 而不是客户端 IP,因为这会给来自公司防火墙后面的用户带来问题——他们的 IP 都是相同的。
他们还建议添加关闭站点某些区域的功能 - 建议管理员用户可以关闭数据库密集区域......然而,这将通过 UI 控制,如果它在 DOS 下肯定攻击管理员用户无论如何都无法访问它。
我的问题是,这样做真的值得吗?真正的 DOS 攻击肯定会更高级吗?
您还有什么建议吗?
最佳答案
拒绝服务攻击几乎可以是任何会影响您为他人提供的服务稳定性的行为。在这种情况下,您谈论的是网络 DoS,并且如前所述,这通常不会发生在您的应用程序级别。
理想情况下,这种攻击会在网络级别得到缓解。有专门为此构建的防火墙,例如 Cisco ASA 5500 series它的工作原理是从基本保护到高吞吐量缓解。它们是非常智能的盒子,我可以保证它们在阻止此类攻击方面的有效性,只要使用适合您获得的吞吐量的正确模型即可。
当然,如果无法访问为您执行此操作的硬件防火墙,您可以采取一些权宜之计来帮助防御这些类型的攻击。 请注意,这些都不会达到专用防火墙的一半效果。
一个这样的例子是 IIS 模块 Dynamic IP Restrictions它允许您定义最大并发请求的限制。然而,在实践中,这有一个缺点,它可能会开始阻止来自浏览器的合法请求,这些浏览器具有高并发请求吞吐量,用于下载脚本和图像等。
最后,您可以做的事情真的很粗糙,但也真的很有效,就像我之前写的那样。基本上,它是一个小工具,用于监视来自同一 IP 的重复请求的日志文件。因此,假设从 1.2.3.4 向 /Home 发出 10 个请求,时间超过 2 秒。如果检测到这种情况,将添加防火墙规则(在 Windows 高级防火墙中,使用 shell 命令添加)以阻止来自该 IP 的请求,然后可以在大约 30 分钟后删除该规则。
就像我说的那样,它非常粗糙,但是如果您必须在服务器级别执行此操作,那么您实际上并没有太多明智的选择,因为它不是应该执行的位置。您是完全正确的,责任在某种程度上由托管服务提供商承担。
最后,您对验证码的看法也是正确的。如果有的话,它可以通过一遍又一遍地执行图像生成(这可能是资源密集型的)来协助 DoS,从而使您的资源更加匮乏。验证码生效的时间是,如果您的网站被自动注册机器人发送垃圾邮件,但我相信您已经知道了。
如果您真的想在应用程序级别做一些事情来取悦当权者,那么在您的应用程序中实现一些基于 IP 的请求限制是可行的,尽管 90% 是无效的(因为您仍然必须处理请求)。
关于c# - 防止恶意请求 - DOS 攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14706188/
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中
我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)
在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g
Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume