Najlepszy sposób na wdrożenie dławienia żądania w ASP.NET MVC?

Eksperymentujemy z różnymi sposobami ograniczania akcji użytkownika w podanym przedziale czasowym:

  • ograniczaj posty pytań / odpowiedzi
  • Limit edycji
  • Limit pobierania paszy

Na razie używamy pamięci podręcznej, aby po prostu wstawić rekord aktywności użytkownika - jeśli ten rekord istnieje, Jeśli / kiedy użytkownik wykonuje tę samą aktywność, dławimy.

Korzystanie z pamięci podręcznej automatycznie daje nam czyszczenie starych danych i aktywność przesuwania okna użytkowników, ale jak to będzie skalować może być problemem.

Jakie są inne sposoby zapewnienia, że żądania/działania użytkowników mogą być skutecznie dławione (nacisk na stabilność)?

Author: Jarrod Dixon, 2008-08-29

3 answers

Oto ogólna wersja tego, czego używamy na Stack Overflow przez ostatni rok:

/// <summary>
/// Decorates any MVC route that needs to have client requests limited by time.
/// </summary>
/// <remarks>
/// Uses the current System.Web.Caching.Cache to store each client request to the decorated route.
/// </remarks>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class ThrottleAttribute : ActionFilterAttribute
{
    /// <summary>
    /// A unique name for this Throttle.
    /// </summary>
    /// <remarks>
    /// We'll be inserting a Cache record based on this name and client IP, e.g. "Name-192.168.0.1"
    /// </remarks>
    public string Name { get; set; }

    /// <summary>
    /// The number of seconds clients must wait before executing this decorated route again.
    /// </summary>
    public int Seconds { get; set; }

    /// <summary>
    /// A text message that will be sent to the client upon throttling.  You can include the token {n} to
    /// show this.Seconds in the message, e.g. "Wait {n} seconds before trying again".
    /// </summary>
    public string Message { get; set; }

    public override void OnActionExecuting(ActionExecutingContext c)
    {
        var key = string.Concat(Name, "-", c.HttpContext.Request.UserHostAddress);
        var allowExecute = false;

        if (HttpRuntime.Cache[key] == null)
        {
            HttpRuntime.Cache.Add(key,
                true, // is this the smallest data we can have?
                null, // no dependencies
                DateTime.Now.AddSeconds(Seconds), // absolute expiration
                Cache.NoSlidingExpiration,
                CacheItemPriority.Low,
                null); // no callback

            allowExecute = true;
        }

        if (!allowExecute)
        {
            if (String.IsNullOrEmpty(Message))
                Message = "You may only perform this action every {n} seconds.";

            c.Result = new ContentResult { Content = Message.Replace("{n}", Seconds.ToString()) };
            // see 409 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
            c.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
        }
    }
}

Przykładowe użycie:

[Throttle(Name="TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
public ActionResult TestThrottle()
{
    return Content("TestThrottle executed");
}

The ASP.NET Cache działa jak mistrz tutaj - używając go, można uzyskać automatyczne czyszczenie wpisów przepustnicy. A przy naszym rosnącym ruchu nie widzimy, że jest to problem na serwerze.

Kiedy poprawimy przepełnienie stosu, Twój Ewok fix będzie jeszcze szybszy:)
 242
Author: Jarrod Dixon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-21 08:07:59

Microsoft ma nowe rozszerzenie dla IIS 7 o nazwie Dynamic IP Restrictions Extension for IIS 7.0 - Beta.

" Dynamic IP Restrictions for IIS 7.0 to moduł zapewniający ochronę przed atakami typu denial of service i brute force na serwer WWW i strony internetowe. Taka ochrona jest zapewniana przez tymczasowe blokowanie adresów IP klientów HTTP, którzy wykonują niezwykle dużą liczbę jednoczesnych żądań lub którzy wykonują dużą liczbę żądań w krótkim czasie." http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/

Przykład:

Jeśli ustawisz kryteria blokowania po X requests in Y milliseconds LUB X concurrent connections in Y milliseconds adres IP zostanie zablokowany dla Y milliseconds, żądania będą ponownie dozwolone.

 69
Author: notandy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 11:07:34

Używamy techniki zapożyczonej z tego adresu URL http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx , nie za Dławienie, ale za odmowę służby biednego człowieka (D. O. S). Jest to również oparte na pamięci podręcznej i może być podobne do tego, co robisz. Dławisz się, żeby zapobiec atakom D. O. S.? Routery z pewnością można wykorzystać do zmniejszenia D. O. S; Czy uważasz, że router poradzi sobie z dławieniem, którego potrzebujesz?

 11
Author: Rob Kraft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 20:59:30