阻止用于访问资源的危险IP
本文关键字:危险 IP 资源 访问 用于 | 更新日期: 2023-09-27 18:06:33
环境
我的IIS托管一个具有WebService资源的WebApp。
- myWebService.asmx
- myWebService.svc
问题
同样的坏人,试图用他们的机器人阻止服务器访问公共资源。
应用解决方案
-
I构建筛选器:
public class BadGuysFilter { private class BadGuy { public BadGuy() { Visits = 0; FirstSuspiciousVisit = DateTime.Now; } public int Visits; public DateTime FirstSuspiciousVisit; } private static volatile Dictionary<string, BadGuy> _blackList = new Dictionary<string, BadGuy>(); private static int _visitsLimit = 10; private static int _minutsLimit = 10; private static int _removeFromBlackListMinutesLimit = 30; public static void Init(int visitsLimit = 10, int minutsLimit = 10, int removeFromBlackListMinutesLimit = 30) { _visitsLimit = visitsLimit; _minutsLimit = minutsLimit; _removeFromBlackListMinutesLimit = removeFromBlackListMinutesLimit; } public static bool IsBadGuy() { return IsBadGuy(HttpContext.Current.Request.UserHostAddress); } public static bool IsBadGuy(string ip) { if (HttpContext.Current.Request.IsAuthenticated /*|| HttpContext.Current.Request.HttpMethod.ToUpper() == "POST"*/) return false; if (_blackList.Keys.Any(k => k == ip)) { _blackList[ip].Visits++; if (_blackList[ip].FirstSuspiciousVisit < DateTime.Now.AddMinutes(-_removeFromBlackListMinutesLimit)) _blackList.Remove(ip); else if (_blackList[ip].FirstSuspiciousVisit < DateTime.Now.AddMinutes(-_minutsLimit)) { _blackList[ip].Visits = 0; _blackList[ip].FirstSuspiciousVisit = DateTime.Now; } else if (_blackList[ip].Visits > _visitsLimit) { _blackList[ip].FirstSuspiciousVisit = DateTime.Now; return true; } } else _blackList.Add(ip, new BadGuy()); return false; } public static void Punish() { var res = HttpContext.Current.Response; res.Clear(); res.StatusCode = 429; res.StatusDescription = "TOO MANY REQUESTS: Your application is sending too many simultaneous requests."; res.End(); } }
-
在Global.asax中使用筛选器
void Application_BeginRequest(object sender, EventArgs e) { if(BadGuysFilter.IsBadGuy()) BadGuysFilter.Punish(); // do stuff // } void Application_EndRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; if (app.Context.Response.StatusCode == 429) // "TOO MANY REQUESTS" return; // do stuff // }
问题
这是一个足够安全的解决方案吗?或者还有别的办法
伊迪丝:"不要在资源本身进行阻塞。在更上游进行阻塞,例如在防火墙处。–Marc B"是的,你是对的。这是最终解决方案,但在应用之前,我需要中间解决方案来保护我的服务器。我忘了提这件事Artiom
您可以使用IIS动态IP限制模块(来自Microsoft(:
http://www.iis.net/downloads/microsoft/dynamic-ip-restrictions
我同意上面的评论。您需要进一步阻止上游的ddos,否则您的应用程序仍将为每个请求提供服务。
这种类型的方法似乎缺乏持久性。因此,当他们轰炸你的系统,你回收应用程序池时,它会重置。另一方面,防火墙学徒缺乏在一定时间后删除的灵活性。。。我想。
也就是说,如果你需要处理不同性质的可疑请求,比如登录页面的请求太多,而不是主页之类的,那么这可能是一个可行的解决方案。
它实际上只是考虑你的所有目标,并了解风险和局限性。