Limitarea ratei este o strategie pe care o puteți folosi pentru a controla traficul într-o rețea. Limitează numărul de solicitări pe care un utilizator le poate face într-un anumit interval de timp.

Există diferiți algoritmi de limitare a ratei, fiecare cu propriile sale compromisuri. O metodă simplă și populară este să urmăriți adresele IP ale solicitărilor și să verificați cât timp trece între solicitări. Apoi, sistemul poate refuza o solicitare dacă adresa sa IP depășește numărul de solicitări permise de limita.

Această abordare a limitării ratei este ușor de construit într-o aplicație NodeJS-Express, cu doar câțiva pași.

Pasul 1: Configurarea unui mediu de dezvoltare

Mai întâi, va trebui să creați și să inițializați o aplicație Express.

Începeți prin a crea un director de proiect rulând:

mkdir express-app

Apoi introduceți acel director rulând:

CD expres-app

Apoi, inițializați npm, managerul de pachete nod, și creați o pachet.json fișier în aplicația dvs. rulând:

npm init -y

The -y steag va crea dvs pachet.json fișier cu toate setările implicite.

În continuare, va trebui să instalați unele dependențe. Dependențele necesare pentru acest tutorial sunt:

  • ExpressJS: ExpressJS este un framework NodeJS care oferă un set robust de caracteristici pentru aplicații web și mobile. Simplifică procesul de construire a aplicațiilor backend cu NodeJS.
  • Limită Rată Express: Express rate limit este un middleware care limitează rata pentru ExpressJS. Limitează solicitările repetate la API-urile publice și/sau punctele finale, cum ar fi resetarea parolei, autentificarea utilizatorilor etc.

Instalați dependențele necesare executând:

npm instalare rata expres expres-limită

Pasul 2: Crearea unei aplicații Express

Va trebui să creați un server Express de bază care să asculte solicitările care se fac către aplicația dvs.

Mai întâi, creați un index.js fișier în directorul rădăcină al proiectului. Acesta va fi fișierul de intrare pentru aplicația dvs.

Apoi, adăugați următorul cod la dvs index.js fişier:

// index.js
const expres = cere("expres");
const aplicație = expres();
const port = process.env. PORT || 3000

app.listen (port, () => {
consolă.Buturuga(`Aplicația rulează pe port ${port}`);
});

Acest cod importă expres și creează o aplicație Express apelând express() și stochând valoarea returnată în fișierul aplicația variabil. Apoi ascultă traficul în port 3000 apelând la asculta metoda pe aplicația obiect.

Pasul 3: Crearea rutelor de gestionare

Apoi, creați câțiva handler de rută pe care să puteți implementa soluția de limitare a ratei.

Mai întâi, creați un folder, rute, în directorul rădăcină al proiectului, rulând:

rute mkdir

Creați un fișier, rute.js, în folderul rute și adăugați următorul cod:

const expres = cere("expres");
const router = expres. Router();

router.get("/", (req, res) => {
res.send({ mesaj: "Bună, aceasta este o solicitare GET" });
});

router.post("/add-demo", (req, res) => {
res.status (201).send({ mesaj: "Resursa creată cu succes" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ mesaj: "Resursa a fost actualizată cu succes" });
});

modul.exporturi = router;

Acest cod importă expres, sună Router metoda pe expresși stochează valoarea într-o variabilă, router. The Router metoda vă permite să creați handlere de rute modulare, montabile. Puteți crea gestionare de rute pentru a OBȚINE cerere la „/", A POST cerere la „/add-demo”, și a A PUNE cerere la „/update-demo”. În cele din urmă, exportați router variabil.

Apoi, importați router variabilă în dvs index.js fişier:

// index.js
const rute = cere(""./rute/rute");

Apoi, utilizați-l ca middleware în fișierul index.js:

// index.js
aplicația.utilizare(trasee);

Asigurați-vă că plasați blocul de cod deasupra înainte de aplicație.ascultă apel.

Pasul 4: Implementarea limitării ratei

Mai întâi, creați un „middleware” folderul din directorul rădăcină al proiectului, rulând:

middleware mkdir

Apoi creați un fișier numit „rate-limiter.js” în directorul middleware. Adăugați următorul cod la acest fișier:

// rate-limiter.js
const rateLimiter = cere("express-rate-limit");

const limitator = rateLimiter({
max: 5,
windowMS: 10000, // 10 secunde
mesaj: "Poti'nu mai fac cereri momentan. Încercați mai târziu",
});

modul.exporturi = limitator

The rateLimiter funcția preia un obiect de configurare cu condițiile pentru a limita numărul de solicitări.

Proprietățile din obiectul de configurare de mai sus sunt:

  • max: Această proprietate trebuie să fie întotdeauna a număr sau o funcție care returnează un număr. Reprezintă numărul maxim de solicitări pe care un utilizator le poate face într-un interval de timp specificat. Dacă această proprietate nu este setată în obiectul de configurare, este implicită 5.
  • windowsMS: Această proprietate ar trebui să fie întotdeauna un număr. Reprezintă intervalul de timp în care sunt permise mai multe cereri milisecunde. Dacă această proprietate nu este setată în obiectul de configurare, valoarea implicită este de 60000 milisecunde (un minut).
  • mesaj: Această proprietate poate fi a şir, un obiect JSON sau orice altă valoare acceptată de Răspunsul lui Express.trimite metodă. Dacă această proprietate nu este setată în obiectul de configurare, este implicit „Prea multe solicitări. Vă rugăm să încercați din nou mai târziu."

Funcția va verifica apoi dacă există solicitări repetate către aplicația dvs. Dacă un utilizator depășește limita (max, 5) în intervalul de timp (windowMS, 10s), va bloca cererea. De asemenea, va genera o eroare „Prea multe solicitări” cu un cod de stare de 429.

În cele din urmă, importați funcția de limitator în dvs index.js fișier și aplicați-l ca middleware global în aplicația dvs. Faceți acest lucru prin plasarea app.use (limitator) deasupra middleware-urilor rutelor. Aceasta aplică soluția de limitare a ratei tuturor rutelor aplicației dvs.

aplicația.utilizare(limitator);

Limitarea ratei rute specifice

De asemenea, puteți aplica limitarea tarifelor pentru anumite rute. Le puteți configura separat pentru a respinge cererile făcute într-un interval de timp diferit, pentru a afișa un mesaj diferit etc.

De exemplu, să presupunem că implementați o rută de conectare a utilizatorului în aplicația dvs. Poate fi necesar să adăugați o configurație de limitare a ratei pentru ruta de conectare, care diferă de configurația utilizată de celelalte rute.

În primul rând, va trebui să eliminați limitator ca middleware la nivel de aplicație și aplicați-l deoarece nu există un sistem de filtrare middleware încorporat în ExpressJS. Deci, chiar dacă adăugați o soluție specifică de limitare a ratei unei rute, middleware-ul global ar rula în continuare pe acea rută.

Apoi, creați o nouă configurație de limitare a ratei în dvs rate-limiter.js fișier și exportați-l.

const signInLimiter = rateLimiter({
max: 3,
windowMS: 10000, //10 secunde
mesaj: "Prea multe încercări de conectare. Încercați mai târziu."
})

modul.exporturi = {
limitator,
signInLimiter
}

The signInLimiter obiectul de configurare are un număr diferit de max solicitări și un mesaj de eroare diferit de limitatorul general de rată.

În cele din urmă, actualizați-vă router.js fișier cu blocul de cod de mai jos:

// router.js
const expres = cere("expres");
const router = expres. Router();
const {limitator, signInLimiter} = cere(""../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ mesaj: "Bună, aceasta este o solicitare GET" });
});

router.utilizare(limitator)

router.post("/post", (req, res) => {
res.status (201).send({ mesaj: "Resursa creată cu succes" });
});

router.put("/put", (req, res) => {
res.status (201).send({ mesaj: "Resursa a fost actualizată cu succes" });
});

modul.exporturi = router;

În blocul de cod de mai sus, ați importat limitator și signInLimiter. Apoi ai aplicat signInLimiter ca un limitator de rată specific pentru „/sign-in" traseu.

În cele din urmă, prin plasare router.use (limitator) deasupra restului rutelor, ați aplicat limitator ca limitator de rată pentru restul rutelor.

Importanța limitării ratei

Limitarea ratei reduce presiunea pe serverul dvs. web, evitând nevoia de a procesa prea multe solicitări simultan. Reduce activitatea botului, vă protejează de atacurile Denial of Service (DoS) și previne atacurile cu forță brută.