Question

Quels outils ou techniques puis-je utiliser pour protéger mon application Web ASP.NET de déni de service attaques

Était-ce utile?

La solution

Essayez l'extension de restriction IP dynamique http://www.iis.net/download/dynamiciprestrictions

Pas une solution parfaite, mais contribue à élever la barre =)

Autres conseils

Il est une zone large, donc si vous pouvez être plus précis sur votre application, ou le niveau de menace que vous essayez de protéger contre, je suis sûr que plus de gens peuvent vous aider.

Cependant, la chauve-souris, vous pouvez opter pour une combinaison d'une solution de mise en cache comme Squid: http://www.blyon.com/using-squid-proxy-to-fight-ddos/ , Restriction IP dynamique (comme l'a expliqué Jim) et si vous avez l'infrastructure, une configuration de basculement actif-passif, où votre machine passive sert du contenu espace réservé qui ne marche pas atteint la base de données / toutes les autres machines. Ce dernier est défense, de sorte que vous réduisez au minimum le temps d'un DDOS peut apporter votre site entier hors ligne.

Pour assurer une solution matérielle est la meilleure option pour prévenir les attaques DOS, mais compte tenu d'une situation dans laquelle vous n'avez pas accès à configuration matérielle ou IIS paramètres, c'est certainement pourquoi un développeur doit avoir quelque chose à portée de main pour bloquer ou au moins diminuer dos effet d'attaque.

Le concept de base de la logique repose sur une collection FIFO (First In First Out), comme la file d'attente, mais il a quelques limitations j'ai décidé de créer ma propre collection.

Sans discuter plus de détails est l'utilisation du code complet I:

public class AntiDosAttack
{
  readonly static List<IpObject> items = new List<IpObject>();

  public static void Monitor(int Capacity, int Seconds2Keep, int AllowedCount)
  {
    string ip = HttpContext.Current.Request.UserHostAddress;

    if (ip == "")
    return;

    // This part to exclude some useful requesters
    if(HttpContext.Current.Request.UserAgent != null && HttpContext.Current.Request.UserAgent == "Some good bots")
      return;

    // to remove old requests from collection
    int index = -1;
    for (int i = 0; i < items.Count; i++)
    {

      if ((DateTime.Now - items[i].Date).TotalSeconds > Seconds2Keep)
      {
        index = i;
        break;
      }
    }

    if (index > -1)
    {
      items.RemoveRange(index, items.Count - index);
    }

    // Add new IP
    items.Insert(0, new IpObject(ip));

    // Trim collection capacity to original size, I could not find a better reliable way
    if (items.Count > Capacity)
    {
      items.RemoveAt(items.Count - 1);
    }

    // Count of currect IP in collection
    int count = items.Count(t => t.IP == ip);

    // Decide on block or bypass
    if (count > AllowedCount)
    {
      // alert webmaster by email (optional)
      ErrorReport.Report.ToWebmaster(new Exception("Blocked probable ongoing ddos attack"), "EvrinHost 24 / 7 Support - DDOS Block", "");

      // create a response code 429 or whatever needed and end response
      HttpContext.Current.Response.StatusCode = 429;
      HttpContext.Current.Response.StatusDescription = "Too Many Requests, Slow down Cowboy!";
      HttpContext.Current.Response.Write("Too Many Requests");
      HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client.
      HttpContext.Current.Response.SuppressContent = true;  // Gets or sets a value indicating whether to send HTTP content to the client.
      HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.
    }
  }

  internal class IpObject
  {
    public IpObject(string ip)
    {
      IP = ip;
      Date = DateTime.Now;
    }

    public string IP { get; set; }
    public DateTime Date { get; set; }
  }
}

La classe interne est conçue pour maintenir la date de la demande.

Naturellement demandes DOS attaque de créer de nouvelles sessions sur chaque demande alors que les demandes humaines sur un site Web contiennent plusieurs demandes emballés dans une session, de sorte que la méthode peut être appelée à Session_Start.

utilisation:

protected void Session_Start(object sender, EventArgs e)
{
   // numbers can be tuned for different purposes, this one is for a website with low requests
   // this means: prevent a request if exceeds 10 out of total 30 in 2 seconds
   AntiDosAttack.Monitor(30, 2, 10);
}

pour un site de demande de lourds vous pouvez changer les secondes en millisecondes mais considérer la charge supplémentaire causé par ce code.

Je ne suis pas au courant s'il y a une meilleure solution pour bloquer les attaques intentionnelles sur le site, je vous remercie de tout commentaire et suggestion pour améliorer le code. D'ici là, je considère cela comme une meilleure pratique pour prévenir les attaques DOS sur les sites Web ASP.NET programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top