Omejevanje hitrosti je strategija, ki jo lahko uporabite za nadzor prometa v omrežju. Omejuje število zahtev, ki jih lahko uporabnik poda v določenem časovnem okviru.

Obstajajo različni algoritmi za omejevanje hitrosti, vsak s svojimi kompromisi. Ena preprosta in priljubljena metoda je sledenje naslovom IP zahtev in preverjanje, koliko časa preteče med zahtevami. Sistem lahko nato zavrne zahtevo, če njen naslov IP preseže število zahtev, ki jih dovoljuje omejitev.

Ta pristop k omejevanju hitrosti je enostavno zgraditi v aplikaciji NodeJS-Express v samo nekaj korakih.

1. korak: Nastavitev razvojnega okolja

Najprej boste morali ustvariti in inicializirati aplikacijo Express.

Začnite z ustvarjanjem projektnega imenika tako, da zaženete:

mkdir express-app

Nato vnesite ta imenik tako, da zaženete:

cd ekspresna aplikacija

Nato inicializiraj npm, upravitelj paketov vozlišč, in ustvarite a package.json datoteko v vaši aplikaciji tako, da zaženete:

npm init -y

The -y zastava bo ustvarila vašo package.json datoteko z vsemi privzetimi nastavitvami.

Nato boste morali namestiti nekaj odvisnosti. Za to vadnico so potrebne odvisnosti:

  • ExpressJS: ExpressJS je ogrodje NodeJS ki zagotavlja robusten nabor funkcij za spletne in mobilne aplikacije. Poenostavlja postopek gradnje zalednih aplikacij z NodeJS.
  • Express Rate Limit: Express rate limit je vmesna programska oprema za ExpressJS, ki omejuje hitrost. Omejuje ponavljajoče se zahteve na javne API-je in/ali končne točke, kot so ponastavitev gesel, prijave uporabnikov itd.

Namestite zahtevane odvisnosti tako, da zaženete:

npm namestite hitra ekspresna stopnja-omejitev

2. korak: Ustvarjanje hitre aplikacije

Ustvariti boste morali osnovni strežnik Express, ki posluša zahteve, poslane vaši aplikaciji.

Najprej ustvarite index.js datoteko v korenskem imeniku vašega projekta. To bo vnosna datoteka za vašo prijavo.

Nato svoji kodi dodajte naslednjo kodo index.js mapa:

// index.js
konst izraziti = zahtevati("hitro");
konst app = express();
konst vrata = proces.env. PRISTANIŠČE || 3000

app.listen (vrata, () => {
konzola.log(`Aplikacija se izvaja na vratih ${port}`);
});

Ta koda uvozi ekspresno in ustvari aplikacijo Express tako, da pokliče express() in shrani njeno vrnjeno vrednost v aplikacija spremenljivka. Nato posluša promet v pristanišču 3000 s klicem na poslušaj metoda na aplikacija predmet.

3. korak: Ustvarjanje upravljavcev poti

Nato ustvarite nekaj upravljavcev poti, na katere lahko implementirate rešitev za omejevanje hitrosti.

Najprej ustvarite mapo routes v korenskem imeniku vašega projekta tako, da zaženete:

poti mkdir

Ustvarite datoteko, routes.js, v mapo routes in dodajte to kodo:

konst izraziti = zahtevati("hitro");
konst usmerjevalnik = express. Usmerjevalnik();

router.get("/", (req, res) => {
res.send({ sporočilo: "Pozdravljeni, to je zahteva GET" });
});

router.post("/add-demo", (req, res) => {
res.status (201).send({ sporočilo: "Vir je bil uspešno ustvarjen" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ sporočilo: "Vir je bil uspešno posodobljen" });
});

modul.izvoz = usmerjevalnik;

Ta koda uvozi ekspresno, kliče Usmerjevalnik metoda na ekspresnoin shrani vrednost v spremenljivko, usmerjevalnik. The Usmerjevalnik vam omogoča ustvarjanje modularnih namestitvenih upravljavcev poti. Ustvarite lahko upravljalnike poti za a DOBITI zahteva za “/«, a OBJAVI zahteva za “/add-demo«, in a POSTAVITE zahteva za “/update-demo”. Končno izvozite usmerjevalnik spremenljivka.

Nato uvozite usmerjevalnik spremenljivka v vašem index.js mapa:

// index.js
konst poti = zahtevati("./poti/poti");

Nato ga uporabite kot vmesno programsko opremo v datoteki index.js:

// index.js
aplikacijauporaba(poti);

Bodite prepričani, da postavite blok kode zgoraj pred aplikacija.poslušaj klic.

4. korak: Implementacija omejevanja hitrosti

Najprej ustvarite »vmesna programska oprema” v korenskem imeniku vašega projekta tako, da zaženete:

mkdir vmesna programska oprema

Nato ustvarite datoteko z imenom "rate-limiter.js” znotraj imenika vmesne programske opreme. V to datoteko dodajte naslednjo kodo:

// rate-limiter.js
konst rateLimiter = zahtevati("omejitev hitre stopnje");

konst limiter = rateLimiter({
največ: 5,
oknoMS: 10000, // 10 sekund
sporočilo: "Ti lahko'trenutno ne postavljam več zahtev. Poskusi znova kasneje",
});

modul.izvoz = omejevalnik

The rateLimiter funkcija vzame konfiguracijski objekt s pogoji za omejitev števila zahtev.

Lastnosti v zgornjem konfiguracijskem objektu so:

  • maks: Ta lastnost mora biti vedno a število ali funkcija, ki vrne število. Predstavlja največje število zahtev, ki jih lahko uporabnik poda v določenem časovnem okviru. Če ta lastnost ni nastavljena v konfiguracijskem objektu, je privzeta vrednost 5.
  • windowsMS: Ta lastnost mora biti vedno številka. Predstavlja časovni okvir, v katerem je dovoljenih več zahtev milisekundah. Če ta lastnost ni nastavljena v konfiguracijskem objektu, je privzeta vrednost 60000 milisekund (ena minuta).
  • sporočilo: Ta lastnost je lahko a vrvica, objekt JSON ali katero koli drugo vrednost, ki jo podpira Odgovor Expressa.pošlji metoda. Če ta lastnost ni nastavljena v konfiguracijskem objektu, je privzeta vrednost »Preveč zahtev. Prosim poskusite kasneje."

Funkcija bo nato preverila ponavljajoče se zahteve za vašo aplikacijo. Če uporabnik preseže omejitev (maks, 5) v roku (oknoMS, 10s), bo zahtevo blokiral. Prav tako bo prikazal napako »Preveč zahtev« s statusno kodo 429.

Končno uvozite funkcijo omejevalnika v svoj index.js in jo uporabite kot globalno vmesno programsko opremo v svoji aplikaciji. To storite tako, da postavite app.use (omejevalnik) nad vmesno programsko opremo poti. To uporabi rešitev za omejevanje hitrosti za vse poti vaše aplikacije.

aplikacijauporaba(omejevalnik);

Posebne poti z omejitvijo hitrosti

Omejitev hitrosti lahko uporabite tudi za določene poti. Lahko jih konfigurirate ločeno, da zavrnejo zahteve, poslane v drugem časovnem okviru, prikažejo drugačna sporočila itd.

Na primer, predpostavimo, da v svoji aplikaciji izvajate pot prijave uporabnika. Morda boste morali dodati konfiguracijo za omejevanje hitrosti za prijavno pot, ki se razlikuje od konfiguracije, ki jo uporabljajo druge poti.

Najprej boste morali odstraniti omejevalnik kot vmesno programsko opremo na ravni aplikacije in jo uporabite, ker v ExpressJS ni vgrajenega sistema filtrov vmesne programske opreme. Tudi če poti dodate določeno rešitev za omejevanje hitrosti, bo globalna vmesna programska oprema še vedno delovala na tej poti.

Nato ustvarite novo konfiguracijo za omejevanje hitrosti v vašem rate-limiter.js datoteko in jo izvozite.

konst signInLimiter = rateLimiter({
največ: 3,
oknoMS: 10000, //10 sekund
sporočilo: "Preveč poskusov prijave. Poskusi znova kasneje."
})

modul.izvoz = {
omejevalnik,
signInLimiter
}

The signInLimiter konfiguracijski objekt ima različno število maks zahteve in drugačno sporočilo o napaki od splošnega omejevalnika hitrosti.

Končno posodobite svoje router.js datoteka s spodnjim blokom kode:

// router.js
konst izraziti = zahtevati("hitro");
konst usmerjevalnik = express. Usmerjevalnik();
konst {limiter, signInLimiter} = zahtevati("../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ sporočilo: "Pozdravljeni, to je zahteva GET" });
});

usmerjevalnik.uporaba(omejevalnik)

router.post("/post", (req, res) => {
res.status (201).send({ sporočilo: "Vir je bil uspešno ustvarjen" });
});

router.put("/put", (req, res) => {
res.status (201).send({ sporočilo: "Vir je bil uspešno posodobljen" });
});

modul.izvoz = usmerjevalnik;

V zgornjem kodnem bloku ste uvozili omejevalnik in signInLimiter. Potem ste se prijavili signInLimiter kot poseben omejevalnik hitrosti za "/sign-in” pot.

Na koncu še z namestitvijo router.use (omejevalnik) nad ostalimi potmi ste uporabili limiter kot omejevalnik hitrosti za preostale poti.

Pomen omejevanja hitrosti

Omejitev hitrosti zmanjša obremenitev vašega spletnega strežnika, tako da se izognete obdelavi preveč zahtev hkrati. Zmanjša aktivnost botov, vas ščiti pred napadi zavrnitve storitve (DoS) in preprečuje napade s surovo silo.