‫Istruttore: In questa lezione implementiamo la limitazione della
‫velocità per evitare che lo
‫stesso IP faccia troppe richieste alla nostra API
‫e questo ci aiuterà a prevenire attacchi
‫come denial of service o attacchi di forza bruta.
‫Quindi, quel limitatore di velocità verrà implementato
‫come una funzione middleware globale.
‫Quindi, in pratica, ciò che farà il limitatore
‫di velocità è contare il numero di richieste provenienti da
‫un IP e poi,
‫quando ci sono troppe richieste, bloccarle, ok?
‫E quindi ha senso implementarlo in un
‫middleware globale, quindi lo facciamo nell'app. js.
‫Quindi, non lo usiamo da molto tempo e il
‫limitatore di velocità che
‫useremo è un pacchetto npm chiamato Express Rate Limit.
‫Quindi installiamolo.
‫npm i express-rate-limit, va bene.
‫E poi, qui nella parte superiore della
‫nostra applicazione, chiamiamola rateLimit e poi richiediamo l'espresso ed
‫effettivamente è già qui Quindi il codice VS prende questo
‫nome dal nostro pacchetto. json file.
‫Ok, e questo nome che gli
‫ho dato qui di solito deriva dalla documentazione.
‫Quindi se lo fanno in questo modo nella
‫documentazione, beh, allora questo è il modo in cui seguo anche io.
‫Ok, ora usiamo questo middleware
‫proprio qui in cima ai nostri middleware globali,
‫scriviamolo qui, global.
‫E iniziamo creando un limitatore.
‫Quindi limitatore, e lo facciamo chiamando
‫la funzione rateLimit che abbiamo appena definito lassù.
‫Quindi rateLimit è una funzione
‫che riceve un oggetto di opzioni, ok?
‫E qui, possiamo
‫sostanzialmente definire quante richieste per IP consentiremo in
‫un certo lasso di tempo.
‫Quindi possiamo specificare la proprietà max, che
‫imposterò a 100, e poi anche la finestra,
‫quindi la finestra temporale, ok?
‫Quindi quello che voglio consentire qui
‫è fondamentalmente, 100 richieste all'ora.
‫E questo qui in realtà si chiama millisecondi di finestra.
‫Ok, quindi vogliamo un'ora, quindi 60
‫minuti, 60 per i secondi, 1000 per i millisecondi.
‫Va bene, quindi di nuovo, ciò
‫che farà è consentire 100 richieste dallo stesso IP in un'ora.
‫Ok, e se quel limite viene
‫poi superato da un certo IP, riceveranno un messaggio di errore.
‫E qui possiamo ora specificare quel messaggio.
‫Troppe richieste da questo IP, riprova tra
‫un'ora, va bene, quindi abbiamo bisogno di trovare un
‫equilibrio che funzioni
‫meglio per la nostra applicazione.
‫Ad esempio, se stai creando
‫un'API, che ha davvero bisogno di molte richieste per un
‫IP, ovviamente questo numero qui dovrebbe essere maggiore.
‫Quindi non seguire ciecamente quello che ho appena messo
‫qui, ma adattalo davvero alla tua applicazione in
‫modo da non renderlo
‫inutilizzabile a causa di questo limitatore, ok?
‫Ad ogni modo, questo limitatore ora qui che abbiamo appena
‫creato è fondamentalmente una funzione middleware, ok?
‫Quindi, rateLimit è una funzione che, in
‫base ai nostri oggetti, creerà una funzione middleware, che
‫ora possiamo usare usando app. utilizzare proprio come abbiamo fatto prima.
‫E possiamo farlo semplicemente così.
‫Ma ciò che in realtà vogliamo
‫è sostanzialmente limitare l'accesso al nostro percorso API.
‫Quindi, possiamo specificarlo qui,
‫ricorda che possiamo farlo con il middleware.
‫Quindi, fondamentalmente vogliamo applicare questo limitatore solo
‫a un'API slash, ok?
‫E quindi ciò influenzerà tutti i
‫percorsi che fondamentalmente iniziano con questo, la tua app in
‫modo che l'API slash in avanti, fantastico.
‫Quindi torniamo alla nostra scheda principale qui.
‫Dagli un salvataggio, e ora proviamo questo e facciamolo qui
‫con il più semplice,
‫quindi prendi tutti i tour, quindi ecco il nostro risultato e
‫ora quello che voglio mostrarti sono queste intestazioni qui.
‫Quindi il nostro limitatore di
‫velocità crea queste due intestazioni, quindi RateLimit-Limit e RateLimit-Remaining, ok?
‫Quindi iniziamo con 100 proprio come abbiamo
‫definito, e ora ci
‫rimane, 99, perché abbiamo già fatto una richiesta, giusto?
‫Quindi cosa succede se ne facciamo un altro?
‫Facciamolo con Get Tour, per esempio, e
‫non c'è tour con
‫quell'ID, ma non importa, ciò che
‫importa qui è che il rimanente è sceso a 98.
‫E se ci
‫riproviamo, vedrai che scende ancora a 97, ok?
‫E in realtà quaggiù, abbiamo anche il reset.
‫Quindi fondamentalmente il timestamp in cui viene reimpostato va bene?
‫Quindi quella finestra di un'ora che abbiamo specificato prima.
‫Ok, ora se nel frattempo la nostra app viene
‫riavviata, quindi per farlo salverò semplicemente.
‫Vediamo cosa succede poi, ok, quindi lo mando
‫di nuovo, e quindi
‫ora siamo tornati dall'inizio in pratica.
‫Ok, quindi la nostra app non può bloccarsi durante questo
‫periodo perché altrimenti, in
‫pratica, anche questo ripristinerà il limite, ok?
‫Ora, proviamo effettivamente a vedere il messaggio
‫di errore, quindi ridurrò questo massimo a soli tre, ok?
‫E salvalo qui, invia questa richiesta, e nelle nostre intestazioni ora
‫vediamo che
‫ne rimangono solo due, proviamone un altro e quindi ora
‫ne rimane zero, quindi questo probabilmente era il nostro
‫ultimo, vediamo il corpo, quindi questa volta,
‫noi abbiamo ancora dei dati,
‫ma se ora proviamo di nuovo, abbiamo un errore.
‫Troppe richieste da questo IP.
‫E poi imposterà automaticamente
‫il codice di stato su 429, il che significa troppe richieste.
‫Ok, e ancora una volta, questo ci aiuterà a cercare
‫di prevenire la negazione del servizio e anche gli attacchi di forza
‫bruta in cui un utente malintenzionato
‫cerca di indovinare la password di qualche
‫utente, fondamentalmente usando come dice il nome, forza bruta.
‫Ok, questa è la limitazione dell'API,
‫abbastanza semplice da implementare con questo
‫pacchetto Express Rate Limit.