Qual è il modo migliore per implementare un algoritmo limitante per le richieste web?
-
11-09-2019 - |
Domanda
Possibili / parziale duplicati:
- Che cosa è un algoritmo di limitare buon tasso?
- metodo Throttling chiamate alle richieste M a N secondi
- modo migliore per implementare richiesta throttling in ASP. NET MVC?
Sto cercando il modo migliore per attuare un momento commovente tasso finestra limitante algoritmo per un'applicazione web per ridurre lo spam o attacchi di forza bruta.
Esempi di utilizzo sarebbe "Numero massimo di tentativi di accesso non riusciti da un determinato IP negli ultimi 5 minuti", "Numero massimo di (post / voti / ecc ...) negli ultimi N minuti".
Io preferirei usare un algoritmo finestra di tempo in movimento, piuttosto che un hard reset delle statistiche ogni x minuti (come Twitter API).
Questo sarebbe per un C # / ASP.Net app.
Soluzione
Utilizzare una tabella hash veloce basato sulla memoria come memcached . Le chiavi saranno bersaglio state limitando (per esempio un IP) e la scadenza di ciascun valore memorizzato dovrebbe essere il tempo massimo limitazione.
I valori memorizzati per ogni chiave conterranno un elenco serializzato degli ultimi N tentativi hanno messo a compiere l'azione, insieme al tempo per ogni tentativo.
Altri suggerimenti
Abbiamo scoperto Token Bucket è migliore algoritmo per questo tipo di rate-limiting. E 'ampiamente utilizzato in router / switch così i nostri ragazzi di funzionamento sono più familiarità con il concetto.
Giusto per aggiungere una risposta piu 'moderna' a questo problema: Per .NET WebAPI, WebApiThrottle è eccellente e probabilmente fa tutto quello che volete fuori dalla scatola.
E ' accessibile NuGet .
L'attuazione 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()
});
Ci trovi questa pagina per essere una lettura interessante:
http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
La sezione di guardare fuori per partenze nel seguente modo:
Prevenire Denial of Service (DoS)
I servizi Web sono il bersaglio più attraente per gli hacker, perché anche un hacker di pre-scuola può portare giù un server ripetutamente chiamando un servizio Web che fa il lavoro costoso.
EDIT: domanda simile qui:
modo migliore per implementare richiesta throttling in ASP. NET MVC?
Ho appena aggiunto la risposta alla domanda richieste API di blocco per 5 minuti se supera il limite di velocità di API.
Ho usato HttpRuntime.Cache
per consentire solo 60 richieste al minuto. Il superamento del limite bloccherà l'API per il prossimo 5 minuti.