Ograničenje brzine je strategija koju možete koristiti za kontrolu prometa na mreži. Ograničava broj zahtjeva koje korisnik može podnijeti unutar određenog vremenskog okvira.

Postoje različiti algoritmi za ograničavanje brzine, svaki sa svojim kompromisima. Jedna jednostavna i popularna metoda je praćenje IP adresa zahtjeva i provjera koliko je vremena prošlo između zahtjeva. Sustav tada može odbiti zahtjev ako njegova IP adresa premašuje broj zahtjeva koji ograničenje dopušta.

Ovaj pristup ograničavanju brzine lako je izgraditi u aplikaciji NodeJS-Express, u samo nekoliko koraka.

Korak 1: Postavljanje razvojnog okruženja

Prvo ćete morati stvoriti i inicijalizirati Express aplikaciju.

Započnite stvaranjem direktorija projekta pokretanjem:

mkdir express-aplikacija

Zatim unesite taj direktorij pokretanjem:

CD ekspresna aplikacija

Zatim inicijalizirajte npm, upravitelj paketa čvora, i stvoriti a paket.json datoteku u svojoj aplikaciji pokretanjem:

npm init -y

The -y zastava će stvoriti tvoju paket.json datoteku sa svim zadanim postavkama.

instagram viewer

Zatim ćete morati instalirati neke ovisnosti. Ovisnosti potrebne za ovaj vodič su:

  • ExpressJS: ExpressJS je okvir NodeJS koji pruža robustan skup značajki za web i mobilne aplikacije. Pojednostavljuje proces izgradnje pozadinskih aplikacija s NodeJS.
  • Express Rate Limit: Express rate limit je posredni softver koji ograničava brzinu za ExpressJS. Ograničava ponovljene zahtjeve na javne API-je i/ili krajnje točke, kao što su poništavanje lozinki, prijave korisnika itd.

Instalirajte potrebne ovisnosti pokretanjem:

npm instalirati ekspresna ekspresna stopa-ograničiti

Korak 2: Izrada Express aplikacije

Morat ćete stvoriti osnovni Express poslužitelj koji sluša zahtjeve upućene vašoj aplikaciji.

Najprije izradite index.js datoteku u korijenskom direktoriju vašeg projekta. Ovo će biti ulazna datoteka za vašu prijavu.

Zatim dodajte sljedeći kod u svoj index.js datoteka:

// index.js
konst izraziti = zahtijevati("izraziti");
konst app = express();
konst luka = ​​proces.env. LUKA || 3000

app.listen (port, () => {
konzola.log(`Aplikacija radi na priključku ${port}`);
});

Ovaj kod uvozi izraziti i stvara Express aplikaciju pozivanjem express() i pohranjivanjem povratne vrijednosti u aplikacija varijabla. Zatim osluškuje promet na luci 3000 pozivom na slušati metoda na aplikacija objekt.

Korak 3: Stvaranje rukovatelja rutom

Zatim stvorite neke rukovatelje rutama na koje možete implementirati rješenje za ograničavanje brzine.

Najprije stvorite mapu, rute, u korijenskom direktoriju vašeg projekta pokretanjem:

mkdir rute

Stvorite datoteku, rute.js, unutar mape ruta i dodajte sljedeći kod:

konst izraziti = zahtijevati("izraziti");
konst ruter = express. Usmjerivač();

router.get("/", (req, res) => {
res.send({ poruka: "Pozdrav, ovo je GET zahtjev" });
});

usmjerivač.post("/add-demo", (req, res) => {
res.status (201).send({ poruka: "Resurs je uspješno kreiran" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ poruka: "Resurs je uspješno ažuriran" });
});

modul.izvozi = ruter;

Ovaj kod uvozi izraziti, poziva the Usmjerivač metoda na izraziti, i pohranjuje vrijednost u varijablu, ruter. The Usmjerivač metoda vam omogućuje stvaranje modularnih rukovatelja rutama koji se mogu montirati. Možete kreirati rukovatelje rutama za a DOBITI zahtjev za "/”, a POST zahtjev za "/add-demo“, i a STAVITI zahtjev za "/update-demo”. Na kraju, izvezite ruter varijabla.

Zatim uvezite ruter varijabla u vašem index.js datoteka:

// index.js
konst rute = zahtijevati("./rute/rute");

Zatim ga upotrijebite kao posredni softver u svojoj datoteci index.js:

// index.js
aplikacijakoristiti(rute);

Svakako postavite blok koda iznad ispred aplikacija.slušati poziv.

Korak 4: Implementacija ograničenja brzine

Prvo stvorite "međuprogramska oprema” u korijenskom direktoriju vašeg projekta pokretanjem:

mkdir međuprogram

Zatim kreirajte datoteku pod nazivom "limiter brzine.js” unutar direktorija međuprograma. Dodajte sljedeći kod u ovu datoteku:

// rate-limiter.js
konst Limiter rate = zahtijevati("express-rate-limit");

konst limiter = rateLimiter({
maksimalno: 5,
prozorMS: 10000, // 10 sekundi
poruka: "Možeš'trenutno ne postavljam više zahtjeva. Pokušajte ponovno kasnije",
});

modul.izvozi = graničnik

The rateLimiter funkcija uzima konfiguracijski objekt s uvjetima za ograničavanje broja zahtjeva.

Svojstva u objektu konfiguracije iznad su:

  • max: Ovo svojstvo uvijek mora biti a broj ili funkcija koja vraća broj. Predstavlja najveći broj zahtjeva koje korisnik može uputiti unutar određenog vremenskog okvira. Ako ovo svojstvo nije postavljeno u konfiguracijskom objektu, zadano je 5.
  • windowsMS: Ovo svojstvo bi uvijek trebalo biti broj. Predstavlja vremenski okvir u kojem je dopušteno nekoliko zahtjeva milisekundi. Ako ovo svojstvo nije postavljeno u konfiguracijskom objektu, zadano je 60000 milisekundi (jedna minuta).
  • poruka: Ova nekretnina može biti a niz, JSON objekt ili bilo koja druga vrijednost koju podržava Expressov odgovor.poslati metoda. Ako ovo svojstvo nije postavljeno u konfiguracijskom objektu, zadana je vrijednost "Previše zahtjeva. Molimo pokušajte ponovo kasnije."

Funkcija će zatim provjeriti ponovljene zahtjeve za vašu aplikaciju. Ako korisnik prekorači ograničenje (max, 5) u roku (prozorMS, 10s), blokirat će zahtjev. Također će izbaciti pogrešku "Previše zahtjeva" sa statusnim kodom od 429.

Konačno, uvezite funkciju limitera u svoj index.js datoteku i primijenite je kao globalni posredni softver u svojoj aplikaciji. Učinite to postavljanjem app.use (limiter) iznad međuprograma ruta. Ovo primjenjuje rješenje za ograničavanje brzine na sve rute vaše aplikacije.

aplikacijakoristiti(limiter);

Specifične rute s ograničenjem brzine

Također možete primijeniti ograničenje stope na određene rute. Možete ih zasebno konfigurirati da odbiju zahtjeve podnesene u drugom vremenskom okviru, prikazuju drugu poruku itd.

Na primjer, pretpostavimo da implementirate put prijave korisnika u svoju aplikaciju. Možda ćete morati dodati konfiguraciju s ograničenjem brzine za rutu prijave koja se razlikuje od konfiguracije koju koriste druge rute.

Prvo ćete morati ukloniti limiter kao međuopreme na razini aplikacije i primijenite ga jer u ExpressJS-u nema ugrađenog sustava filtriranja međuopreme. Dakle, čak i ako ruti dodate određeno rješenje za ograničavanje brzine, globalni srednji softver će i dalje raditi na toj ruti.

Zatim stvorite novu konfiguraciju za ograničavanje brzine u svom limiter brzine.js datoteku i izvezite je.

konst signInLimiter = rateLimiter({
maksimalno: 3,
prozorMS: 10000, //10 sekundi
poruka: "Previše pokušaja prijave. Pokušajte ponovno kasnije."
})

modul.izvozi = {
limitator,
signInLimiter
}

The signInLimiter konfiguracijski objekt ima različit broj max zahtjeve i drugu poruku o pogrešci od općeg limitatora brzine.

Konačno, ažurirajte svoje usmjerivač.js datoteka s blokom koda ispod:

// router.js
konst izraziti = zahtijevati("izraziti");
konst ruter = express. Usmjerivač();
konst {limiter, signInLimiter} = zahtijevati("../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ poruka: "Pozdrav, ovo je GET zahtjev" });
});

ruter.koristiti(limiter)

usmjerivač.post("/post", (req, res) => {
res.status (201).send({ poruka: "Resurs je uspješno kreiran" });
});

router.put("/put", (req, res) => {
res.status (201).send({ poruka: "Resurs je uspješno ažuriran" });
});

modul.izvozi = ruter;

U gornjem bloku koda uvezli ste limiter i signInLimiter. Onda ste se prijavili signInLimiter kao specifični limitator brzine za "/sign-in” ruta.

Na kraju, postavljanjem router.use (limiter) iznad ostalih ruta, primijenili ste limiter kao limitator brzine za ostale rute.

Važnost ograničenja brzine

Ograničenje brzine smanjuje opterećenje vašeg web poslužitelja izbjegavanjem potrebe za obradom previše zahtjeva odjednom. Smanjuje aktivnost robota, štiti vas od napada uskraćivanjem usluge (DoS) i sprječava napade brutalnom silom.