【问题标题】:Blocking dangerous IPs for accessing a resource阻止访问资源的危险 IP
【发布时间】:2013-03-19 03:05:04
【问题描述】:

环境

我的 IIS 托管一个带有 WebService 资源的 WebApp。

  • ...
  • myWebService.asmx
  • myWebService.svc
  • ...

问题

同样的坏人,尝试用他们的机器人阻止服务器访问公共资源。

应用解决方案

  1. 我建立一个过滤器:

    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();
        }
    }
    
  2. 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” 你是对的。这是最终解决方案,但在应用之前我需要中间解决方案来保护我的服务器。我忘了提这件事。 – 阿蒂姆

【问题讨论】:

  • 不要阻塞资源本身。阻止更远的上游,例如在防火墙处。
  • 正如@MarcB 所说,此解决方案将为每个被阻止的请求占用 IIS 资源,如果他们进行 DDOS 攻击,这将无济于事。
  • 是的,你是对的。这是最终解决方案,但在应用之前我需要中间解决方案来保护我的服务器。我忘了提这件事。

标签: c# asp.net wcf security iis


【解决方案1】:

您可以使用 IIS 动态 IP 限制模块(来自 Microsoft):

http://www.iis.net/downloads/microsoft/dynamic-ip-restrictions

【讨论】:

    【解决方案2】:

    我同意上面的 cmets。您需要在上游进一步阻止 ddos​​,否则您的应用程序仍将为每个请求提供服务。

    这种方法似乎缺乏持久性。因此,当他们轰炸您的系统并且您回收应用程序池时,它将重置。另一方面,防火墙方法缺乏在一段时间后删除的灵活性......我认为。

    也就是说,如果您需要处理不同性质的可疑请求,例如对登录页面的请求过多而不是对主页的请求,那么这可能是一个可行的解决方案。

    这实际上只是考虑您的所有目标并了解风险和限制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2021-09-05
      • 1970-01-01
      • 2013-12-02
      • 2021-11-29
      相关资源
      最近更新 更多