是否有一种方法来检测DOS在ApplicationBeginRequest或任何其他事件

本文关键字:ApplicationBeginRequest DOS 任何 事件 其他 检测 方法 一种 是否 | 更新日期: 2023-09-27 18:10:09

检测DOS攻击和来自直接网站的攻击者的最佳方法是什么?. NET MVC),如ApplicationBeginRequest.

我在这个网站上搜索,发现了一个类似的问题,没有任何答案或例子。谷歌也没有找到任何结果。

使用Asp.net MVC中的代码限制IP's

我知道IIS上的动态IP地址限制,但我希望网站能够检测到这种攻击并发送电子邮件警报。

不幸的是,我无法访问我的IIS日志,因为我的网站是共享主机。

是否有一种方法来检测DOS在ApplicationBeginRequest或任何其他事件

在我对你的问题的评论中(即,这实际上不会阻止DDOS,因为DDOS很可能发生在网络堆栈的较低级别),这里有一个基于泄漏桶抽象的速率限制器,在过去的几年里,它很好地满足了我的目的:

public class RateLimiter
{
   private readonly double numItems;
   private readonly double ratePerSecond;
   private readonly ConcurrentDictionary<object, RateInfo> rateTable = 
                             new ConcurrentDictionary<object, RateInfo>();
   private readonly double timePeriod;
   public RateLimiter(double numItems, double timePeriod)
   {
       this.timePeriod = timePeriod;
       this.numItems = numItems;
       ratePerSecond = numItems / timePeriod;
   }
   public double Count
   {
       get
       {
           return numItems;
       }
   }
   public double Per
   {
       get
       {
           return timePeriod;
       }
   }
   public bool IsPermitted(object key)
   {
       var permitted = true;
       var now = DateTime.UtcNow;
        rateTable.AddOrUpdate(
            key,
            k => new RateInfo(now, numItems - 1d),
            (k, rateInfo) => {
                var timePassedSeconds = 
                                  (now - rateInfo.LastCheckTime).TotalSeconds;
                var newAllowance = 
                                  Math.Min(rateInfo.Allowance 
                                            + timePassedSeconds 
                                            * ratePerSecond,
                           numItems);
                if (newAllowance < 1d)
                {
                    permitted = false;
                }
                else
                {
                    newAllowance -= 1d;
                }
                return new RateInfo(now, newAllowance);
            });
        var expiredKeys = rateTable
               .Where(kvp => 
                   (now - kvp.Value.LastCheckTime) > 
                   TimeSpan.FromSeconds(timePeriod))
               .Select(k => k.Key);
        foreach (var expiredKey in expiredKeys)
        {
            Reset(expiredKey);
        }
       return permitted;
   }
   public void Reset(object key)
   {
        RateInfo rr;
        rateTable.TryRemove(key,out rr);
   }

   internal struct RateInfo
   {
       private readonly double allowance;
       private readonly DateTime lastCheckTime;
       public RateInfo(DateTime lastCheckTime, double allowance)
       {
           this.lastCheckTime = lastCheckTime;
           this.allowance = allowance;
       }
       public DateTime LastCheckTime
       {
           get
           {
               return lastCheckTime;
           }
       }
       public double Allowance
       {
           get
           {
               return allowance;
           }
       }
   }
}

确保你的密钥适合存储在哈希表中(例如,它们实现了等式和.GetHashCode),并像这样使用它:

void Main()
{
    var limiter=new RateLimiter(5,1);   //permit 5 items every 1 second
    AddStuff(limiter);
    Thread.Sleep(10000);
}
async Task AddStuff(RateLimiter limiter)
{
    for(var i=0;i<10000;++i)
    {
        Console.WriteLine(limiter.IsPermitted("foo"));
        await Task.Delay(10);
    }
}

DDOS攻击是分布式拒绝服务。如果它是以一种聪明的方式完成的(使用半同步的僵尸网络,它不会疯狂地向您发送垃圾邮件,而是使用间歇性的请求泛滥),那么我不确定是否真的存在一种检测它的好方法。检测DDoS需要大量的统计分析,而攻击者知道正在分析什么和如何分析,可以修补他的僵尸网络以绕过防御。

嗯,当每分钟有n个请求或类似的东西(MSDN, StackOverflow)时,你可以检测到你的站点过载。但是你会怎么做——只是中止它们并在过载期间禁止ip吗?在不造成附带损害的情况下,很难对DDoS进行可靠的分析和防范。

相关文章:
  • 没有找到相关文章