¿Cuál es la mejor manera de implementar un algoritmo de limitación de velocidad para solicitudes web?

StackOverflow https://stackoverflow.com/questions/1450217

Pregunta

Posibles/duplicados parciales:

Estoy buscando la mejor manera de implementar un algoritmo de limitación de velocidad de ventana de tiempo en movimiento para una aplicación web para reducir el spam o los ataques de fuerza bruta.

Ejemplos de uso serían "Número máximo de intentos fallidos de inicio de sesión desde una IP determinada en los últimos 5 minutos", "Número máximo de (publicaciones/votos/etc...) en los últimos N minutos".

Preferiría utilizar un algoritmo de ventana de tiempo en movimiento, en lugar de un restablecimiento completo de las estadísticas cada X minutos (como la API de Twitter).

Esto sería para una aplicación C#/ASP.Net.

¿Fue útil?

Solución

Utilice una tabla hash basado en memoria rápida como memcached . Las claves será el blanco está limitando (por ejemplo, un IP) y la expiración de cada valor almacenado debe ser el tiempo máximo de limitación.

Los valores almacenados para cada tecla contendrán una lista serializado de los últimos N intentos que hicieron en la realización de la acción, junto con el tiempo para cada intento.

Otros consejos

Token Bucket es mejor algoritmo para este tipo de limitante de la velocidad. Es ampliamente utilizado en los routers / switches de modo que nuestra gente de operación están más familiarizados con el concepto.

Sólo para añadir una respuesta más 'moderna' a este problema: Para .NET WebAPI, WebApiThrottle es excelente y, probablemente, hace todo lo que quiere de la caja.

También es disponibles en NuGet .

La aplicación toma sólo un minuto más o menos y que es altamente personalizable:

config.MessageHandlers.Add(new ThrottlingHandler()
{
    Policy = new ThrottlePolicy(perSecond: 1, perMinute: 30, perHour: 500, perDay:2000)
    {
        IpThrottling = true,
        ClientThrottling = true,
        EndpointThrottling = true
    },
    Repository = new CacheRepository()
});

encontrar esta página a ser una lectura interesante:

http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx

La sección a tener en cuenta para el comienzo de la siguiente manera:

  

Evitar la denegación de servicio (DoS)

     

Los servicios web son el blanco más atractivo para los hackers porque incluso un hacker preescolar puede derribar un servidor llamando repetidamente a un servicio Web, que hace el trabajo caro.

EDIT: Pregunta similar aquí:

mejor manera de implementar la solicitud de estrangulación en ASP. NET MVC?

Acabo de agregar la respuesta a la pregunta. Bloquee las solicitudes de API durante 5 minutos si se excede el límite de tasa de API.
solía HttpRuntime.Cache para permitir sólo 60 solicitudes por minuto.Exceder el límite bloqueará la API durante los próximos 5 minutos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top