4

環境

私の 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 //
    }
    

質問

これは十分に安全な解決策ですか?それとも別の方法がありますか?

Edite: 「リソース自体でブロックしないでください。さらに上流、たとえばファイアウォールでブロックしてください。– Marc B」 はい、その通りです。これは最終的な解決策ですが、適用する前にサーバーを防御するための中間的な解決策が必要です。このことについて言及するのを忘れていました。– アルティオム

4

2 に答える 2

5

IIS 動的 IP 制限モジュール (Microsoft から) を使用できます。

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

于 2013-03-28T15:47:09.653 に答える
0

上記のコメントに同意します。ddos をさらに上流でブロックする必要があります。そうしないと、アプリケーションは引き続き各要求を処理します。

このタイプのアプローチには持続性がないように見えます。したがって、彼らがあなたのシステムを攻撃し、アプリ プールをリサイクルすると、リセットされます。一方、ファイアウォールのアプローチには、一定時間後に削除する柔軟性がありません...と思います。

とはいえ、ログインページへのリクエストが多すぎてホームページへのリクエストが多すぎるなど、別の性質の疑わしいリクエストを処理する必要がある場合、これは実行可能なソリューションになる可能性があります.

すべての目標を検討し、リスクと制限を理解するだけです。

于 2013-03-28T15:51:03.890 に答える