2009-09-20 5 views
24

Possibili/duplicati parziali:Qual è il modo migliore per implementare un algoritmo di limitazione della velocità per le richieste Web?

sto cercando il modo migliore per attuare un momento commovente tasso finestra limitante algoritmo per un'applicazione web per ridurre spam o attacchi di forza bruta.

Esempi di utilizzo sarebbe "Numero massimo di tentativi di accesso non riusciti da un dato IP negli ultimi 5 minuti", "Numero massimo di (messaggi/voti/ecc.) Negli ultimi N minuti".

Preferirei utilizzare un algoritmo di finestra temporale mobile, piuttosto che un hard reset delle statistiche ogni X minuti (come twitter api).

Questo sarebbe per un'app C#/ASP.Net.

+0

Non penso che nessuno dei duplicati in dotazione risponda veramente a questa domanda con un asp.net/c# slant. – spender

+0

@spender: da qui quella parola "possibile" ;-) – Argalatyr

+0

Era davvero diretto all'elettore "vicino" piuttosto che al contenuto della domanda originale. – spender

risposta

10

Utilizzare un hash basato su memoria veloce come memcached. Le chiavi saranno l'obiettivo che stai limitando (ad esempio un IP) e la scadenza di ciascun valore memorizzato dovrebbe essere il tempo massimo di limitazione.

I valori memorizzati per ogni chiave conterranno un elenco serializzato degli ultimi N tentativi fatti durante l'esecuzione dell'azione, insieme al tempo per ogni tentativo.

+2

Quindi, per ogni tentativo, avrei deserializzato l'elenco memorizzato nella cache, tagliato le voci all'esterno della finestra temporale, aggiunto una nuova voce, contato gli elementi e aggiornato la cache? – Lamar

+0

@Lamar È possibile utilizzare Redis anziché Memcached. Redis ha costruito il supporto per le liste e ottenere get-last e get-last - penso che con Redis non sarà necessario deserializzare l'intera lista. Google per "redis rate limiting" – KajMagnus

+0

@KajMagnus Redis è sicuramente la soluzione corretta per questo. Supporto per le liste e applicazione per valutare il lavoro di limitazione molto bene insieme. – Lamar

23

Abbiamo scoperto che Token Bucket è un algoritmo migliore per questo tipo di limitazione della velocità. È ampiamente utilizzato nei router/interruttori in modo tale che i nostri utenti abbiano familiarità con il concetto.

2

Trovate questa pagina per essere una lettura interessante:

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

La sezione di guardare fuori per partenze come segue:

Prevenire Denial of Service (DoS)

I servizi Web sono l'obiettivo più attraente per gli hacker perché anche un hacker prescolare può abbattere un servizio r chiamando ripetutamente un servizio Web che fa un lavoro costoso.

EDIT: domanda simile qui:

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

5

solo per aggiungere una risposta piu 'moderna' a questo problema: Per .NET WebAPI, WebApiThrottle è eccellente e, probabilmente, fa tutto quello che volete fuori la scatola.

È anche available on NuGet.

implementazione richiede solo un minuto o giù di lì ed è altamente personalizzabile:

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() 
});