Se stai creando un'API o un portale web pubblico, probabilmente sei preoccupato per le prestazioni. La limitazione della velocità può aiutare a prevenire l'abuso degli attacchi DDoS di base, ed è abbastanza semplice da configurare per le applicazioni Blazor / ASP.NET Core.
Perché le richieste di rate cap??
Ci sono molte ragioni per qualificare le richieste di limite. La maggior parte dei servizi dovrebbe probabilmente impostare una sorta di limite di velocità, perché nessun essere umano ragionevole si esibirà 100 richieste al secondo per dieci minuti di fila. Per impostazione predefinita, la tua applicazione risponderà a tutte le richieste, quindi determinare un limite ragionevole è una buona idea.
Decisamente, anche il tuo provider cloud potrebbe avere una protezione DDoS. Questo generalmente proteggerà bene dagli attacchi di Cloak. 3 e 4 diretto al tuo server. Nonostante questo, vorrai assicurarti che il tuo server faccia tutto il possibile per impedire agli aggressori di accedervi.
Inoltre hai la possibilità di impostare il limite molto più basso per limitare le richieste sulle API pubbliche. Come esempio, forse un determinato endpoint richiede molta elaborazione per rispondere alla richiesta. Potresti voler limitare questo endpoint in modo che nessun indirizzo IP possa eseguire più di poche richieste ogni due secondi, che limita lo stress sul tuo server / Banca dati.
Impostazione del limite di velocità in ASP.NET Core
Blazer come framework si basa su ASP.NET Core, che gestisce tutti gli elementi interni per l'esecuzione di un server HTTP e la risposta alle richieste. Perché, sarà necessario configurare la limitazione della velocità per ASP.NET Core. Gli stessi passaggi si applicano a chiunque non utilizzi Blazor.
Sfortunatamente, il limite di velocità non è una funzionalità predefinita in ASP.NET Core. Nonostante questo, esiste un pacchetto NuGet molto popolare, AspNetCoreRateLimit
, fa il suo lavoro abbastanza bene. Puoi installarlo facendo clic con il pulsante destro del mouse sul tuo progetto in Visual Studio e selezionando “Gestisci i pacchetti NuGet …”:
Cercare AspNetCoreRateLimit
e installalo.
Ci sono alcune alternative alla limitazione della velocità. Se stai usando un'API che necessita di chiavi, ti suggeriamo di limitare la tariffa in base alla chiave API, coprendo tutti i casi. Per la maggior parte delle persone, la limitazione della velocità basata sull'indirizzo IP probabilmente va bene, ed è il valore predefinito consigliato da AspNetCoreRateLimit.
Dovrai aggiungerlo come servizio ad ASP.NET. Tutti i servizi sono configurati in Startup.cs
, che li aggiunge con il ConfigureServices(IServiceCollection services)
funzione.
Ci sono parecchi servizi da configurare. La prima funzione configura i servizi per caricare le configurazioni dal suo file di configurazione. Dovrai anche aggiungere la cache Microsoft se non l'hai già fatto.. Dopo, dovrai configurare IpRateLimiting dal file JSON e quindi aggiungere il limitatore di velocità.
// necessario per caricare la configurazione da appsettings.json Servizi.Aggiungi opzioni(); // necessario per memorizzare i contatori dei limiti di velocità e le regole IP Servizi.AggiungiMemoryCache(); //carica la configurazione generale da appsettings.json Servizi.Configura(Configurazione.OttieniSezione("IpRateLimiting")); // iniettare contatore e negozi di regole Servizi.AddInMemoryRateLimiting(); // configurazione (risolutori, contro costruttori di chiavi) Servizi.AggiungiSingleton<IRateLimitConfiguration, Configurazione limite tariffa>();
Anche in Startup.cs
, dovrai configurare il generatore di app per utilizzare la limitazione della velocità IP.
app.UseIpRateLimiting();
Nota che questo utilizza una limitazione della velocità di memoria, cos'è per esempio?. Se stai bilanciando il carico della tua applicazione, dovrai usare un archivio di memoria distribuita come Redis, di questo pacchetto ha anche il supporto per.
Impostazioni di limitazione della velocità
Una volta aggiunto ad ASP.NET, dovresti andare da te appsettings.json
file di configurazione per configurarlo. La configurazione sembra la prossima:
"IpRateLimiting": { "Abilita EndpointRateLimiting": falso, "StackBlocked Richieste": vero, "RealIpHeader": "X-Real-IP", "Intestazione ID cliente": "X-ClientId", "HttpStatusCode": 429, "IPWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ], "EndpointWhitelist": [ "ottenere:/api/licenza", "*:/api/stato" ], "Lista bianca cliente": [ "dev-id-1", "dev-id-2" ], "Regole generali": [ { "Endpoint": "*", "Periodo": "1S", "Limite": 2 }, { "Endpoint": "*", "Periodo": "15m", "Limite": 100 }, { "Endpoint": "*", "Periodo": "12h", "Limite": 1000 }, { "Endpoint": "*", "Periodo": "7D", "Limite": 10000 } ] }
Primo, se prevedi di limitare in modo diverso determinati endpoint, vorrai abilitare EnableEndpointRateLimiting, che è falso per impostazione predefinita.
StackBlockedRequests farà contare le richieste bloccate per il contatore. Semplicemente, con questo disabile, chiunque faccia ripetutamente richieste riceverà X risposte per periodo. Con lui attivato, le risposte massime aumenteranno molto rapidamente e quindi non verrà data ulteriore risposta.
RealIpHeader e ClientIdHeader vengono utilizzati quando il server è protetto da un proxy inverso, che è una configurazione comune. Poiché le richieste proverranno sempre dal server proxy, il proxy imposta un'intestazione con le informazioni effettive dell'utente. Dovrai controllare il tuo proxy e assicurarti che questa intestazione sia impostata correttamente, caso opposto, il limitatore di velocità tratterà tutti come lo stesso IP.
Dopo, ci sono tre liste bianche, uno per IP, ID cliente ed endpoint. Puoi eliminarli se non ti servono.
Dopo, dovrai configurare ogni endpoint, così come un periodo e un limite. Un carattere jolly coprirà tutto ed è l'unica cosa che funziona con EnableEndpointRateLimiting impostato su false. Se non è così, puoi impostare gli endpoint usando {HTTP_VERB}{PATH}
, compresi i caratteri jolly, affinché *:/api/values
corrisponderà a tutte le richieste GET e POST per /api/values
.
Ti consigliamo di assicurarti che il tuo endpoint corrisponda a un file e non a una directory. Nel mio caso, *:/download/*/*
era un punto finale valido, ma *:/download/*/*/
Non era, a causa della barra finale.
Questa configurazione predefinita include una whitelist IP per localhost, che dovresti commentare se stai testando. Ma, dovresti essere in grado di testare la tua configurazione impostando il limite molto basso, Che cosa 5 al minuto, e facendo un mucchio di richieste. Questo errore dovrebbe apparire, “Quota di chiamate API superata”, il che significa che funziona correttamente.
C'è molto di più che questo pacchetto può fare, quindi se hai esigenze più specifiche di questa, consigliamo controllando la tua documentazione e vedere cosa è fattibile.