route - ¿La mejor manera de implementar la limitación de solicitudes en ASP.NET MVC?
web forms c# tutorial (3)
Estamos experimentando con varias formas de estrangular las acciones de los usuarios en un período de tiempo determinado :
- Limitar mensajes de preguntas / respuestas
- Limitar ediciones
- Limitar las recuperaciones de alimento
Por el momento, estamos usando el Caché para simplemente insertar un registro de la actividad del usuario: si ese registro existe si / cuando el usuario realiza la misma actividad, aceleramos.
El uso de la memoria caché nos proporciona automáticamente la limpieza de datos obsoletos y las ventanas de actividad deslizantes de los usuarios, pero su escala podría ser un problema.
¿Cuáles son algunas otras formas de asegurar que las solicitudes / acciones de los usuarios puedan ser efectivamente reducidas (énfasis en la estabilidad)?
Aquí hay una versión genérica de lo que hemos estado usando en durante el año pasado:
/// <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;
}
}
}
Uso de la muestra:
[Throttle(Name="TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
public ActionResult TestThrottle()
{
return Content("TestThrottle executed");
}
El Caché de ASP.NET funciona como un campeón aquí. Al usarlo, obtiene una limpieza automática de sus entradas del acelerador. Y con nuestro creciente tráfico, no vemos que esto sea un problema en el servidor.
Siéntase libre de dar su opinión sobre este método; cuando hacemos que sea mejor, obtienes tu Ewok fix aún más rápido :)
Microsoft tiene una nueva extensión para IIS 7 llamada Extensión de restricciones de IP dinámica para IIS 7.0 - Beta.
"Las restricciones de IP dinámica para IIS 7.0 es un módulo que brinda protección contra los ataques de denegación de servicio y de fuerza bruta en el servidor web y los sitios web. Esta protección se proporciona mediante el bloqueo temporal de las direcciones IP de los clientes HTTP que realizan un número inusualmente alto de solicitudes concurrentes. o que hacen un gran número de solicitudes en un corto período de tiempo ". http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/
Ejemplo:
Si configura los criterios para bloquear después de X requests in Y milliseconds
o X concurrent connections in Y milliseconds
la dirección IP se bloqueará durante Y milliseconds
entonces se volverán a permitir las solicitudes.
Utilizamos la técnica tomada de esta URL http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx , no para la regulación, sino para la Denegación de Servicio (DOS) de un hombre pobre. Esto también está basado en caché y puede ser similar a lo que está haciendo. ¿Estás acelerando para evitar los ataques de DOS? Los enrutadores pueden usarse para reducir DOS; ¿Crees que un enrutador podría manejar la regulación que necesitas?