2009-09-20 15 views
24

posibles duplicados/parciales:¿Cuál es la mejor manera de implementar un algoritmo de limitación de velocidad para las solicitudes web?

Estoy buscando la mejor manera de aplicar una tasa ventana de tiempo en movimiento que limita algoritmo para una aplicación web para reducir spam o ataques de fuerza bruta.

Ejemplos de uso serían "Número máximo de intentos de inicio de sesión fallidos desde una IP determinada en los últimos 5 minutos", "Número máximo de (publicaciones/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 las estadísticas cada X minutos (como la API de Twitter).

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

+0

No creo que ninguno de los incautos suministrados realmente responda esta pregunta con un asp.net/c# slant. – spender

+0

@spender: de ahí que la palabra "posible" ;-) – Argalatyr

+0

realmente se dirigió al votante "cercano" en lugar de al contenido original de la pregunta. – spender

Respuesta

10

Utilice una tabla hash rápida basada en memoria como memcached. Las claves serán el objetivo que está limitando (por ejemplo, una IP) y la caducidad de cada valor almacenado debería 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.

+2

Entonces, ¿para cada intento, deserializaría la lista en caché, cortaría las entradas fuera de la ventana de tiempo, agregaría una nueva entrada, contaría los elementos y actualizaría la caché? – Lamar

+0

@Lamar Puede usar Redis en lugar de Memcached. Redis ha creado soporte para listas y get-first y get-last - Creo que con Redis no tendrá que deserializar toda la lista. Google para "redis rate limit" – KajMagnus

+0

@KajMagnus Redis es definitivamente la solución correcta para esto. Soporte para listas y aplicarlo para calificar muy bien el trabajo de limitación. – Lamar

23

Nos enteramos Token Bucket es mejor algoritmo para este tipo de limitación de velocidad. Se usa ampliamente en enrutadores/conmutadores para que nuestros operadores estén más familiarizados con el concepto.

2

obtendrán esta página a ser una lectura interesante:

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

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

Prevenir la denegación de servicio (DoS)

Los servicios web son el objetivo más atractivo para los piratas informáticos porque incluso un pirata informático de preescolar puede derribar un servidor r llamando repetidamente a un servicio web que hace un trabajo costoso.

EDIT: Pregunta similar aquí:

Best way to implement request throttling in ASP.NET MVC?

5

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 available on NuGet.

Implementació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() 
}); 
Cuestiones relacionadas