c# asp.net algorithm throttling rate-limiting

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



asp.net algorithm (5)

Acabo de agregar la respuesta a la pregunta Bloquear solicitudes de API durante 5 minutos si el límite de velocidad de la API excede.
Utilicé HttpRuntime.Cache para permitir solo 60 solicitudes por minuto. Superar el límite bloqueará la API durante los próximos 5 minutos.

Posibles duplicados / parciales:

Estoy buscando la mejor manera de implementar un algoritmo de límite de velocidad de ventana de tiempo móvil 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 (mensajes / votos / etc ...) en los últimos N minutos".

Preferiría usar un algoritmo de ventana de tiempo móvil, en lugar de un restablecimiento completo de estadísticas cada X minutos (como la API de Twitter).

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


Descubrimos que Token Bucket es un mejor algoritmo para este tipo de limitación de velocidad. Es ampliamente utilizado en enrutadores / conmutadores, por lo que nuestra gente de operaciones está más familiarizada con el concepto.


Encuentras esta página como una lectura interesante:

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

La sección a tener en cuenta comienza de la siguiente manera:

Prevenir el ataque de denegación de servicio (DOS)

Los servicios web son el objetivo más atractivo para los piratas informáticos, ya que incluso un pirata informático preescolar puede derribar un servidor al llamar repetidamente a un servicio web que hace un trabajo costoso.

EDITAR: pregunta similar aquí:

¿La mejor manera de implementar la limitación de solicitudes en ASP.NET MVC?


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

Los valores almacenados para cada clave contendrán una lista serializada de los últimos N intentos que realizaron al realizar la acción, junto con el tiempo de cada intento.


Solo para agregar una respuesta más ''moderna'' a este problema: para .NET WebAPI, WebApiThrottle es excelente y probablemente haga todo lo que quiera de forma WebApiThrottle .

También está disponible en NuGet .

La implementación toma solo un minuto y 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() });