Obmedzenie rýchlosti je stratégia, ktorú môžete použiť na riadenie prevádzky v sieti. Obmedzuje počet žiadostí, ktoré môže používateľ podať v určitom časovom rámci.
Existujú rôzne algoritmy na obmedzenie rýchlosti, z ktorých každý má svoje vlastné kompromisy. Jednou jednoduchou a populárnou metódou je sledovať adresy IP žiadostí a kontrolovať, koľko času uplynie medzi žiadosťami. Systém potom môže odmietnuť požiadavku, ak jeho IP adresa prekročí povolený počet požiadaviek.
Tento prístup k obmedzeniu sadzieb sa dá ľahko vytvoriť v aplikácii NodeJS-Express pomocou niekoľkých krokov.
Krok 1: Nastavenie vývojového prostredia
Najprv budete musieť vytvoriť a inicializovať aplikáciu Express.
Začnite vytvorením projektového adresára spustením:
expresná aplikácia mkdir
Potom zadajte tento adresár spustením:
cd expresná aplikácia
Ďalej inicializujte npm, správca balíkov uzlov, a vytvorte a package.json súbor vo vašej aplikácii spustením:
npm init -y
The -y vlajka vytvorí váš package.json súbor so všetkými predvolenými nastaveniami.
Ďalej budete musieť nainštalovať nejaké závislosti. Závislosti požadované pre tento tutoriál sú:
- ExpressJS: ExpressJS je rámec NodeJS ktorý poskytuje robustnú sadu funkcií pre webové a mobilné aplikácie. Zjednodušuje proces vytvárania backendových aplikácií s NodeJS.
- Expresný limit sadzby: Express rate limit je middleware obmedzujúci rýchlosť pre ExpressJS. Obmedzuje opakované požiadavky na verejné rozhrania API a/alebo koncové body, ako je obnovenie hesla, prihlásenie používateľov atď.
Nainštalujte požadované závislosti spustením:
npm Inštalácia expresná expresná sadzba-limit
Krok 2: Vytvorenie expresnej aplikácie
Budete musieť vytvoriť základný expresný server, ktorý počúva požiadavky odosielané do vašej aplikácie.
Najprv vytvorte index.js súbor v koreňovom adresári vášho projektu. Toto bude vstupný súbor pre vašu aplikáciu.
Ďalej pridajte nasledujúci kód do svojho index.js súbor:
// index.js
konšt vyjadriť = vyžadovať("expresné");
konšt app = express();
konšt port = process.env. PORT || 3000
app.listen (port, () => {
konzoly.log(`Aplikácia beží na porte ${port}`);
});
Tento kód importuje expresné a vytvorí expresnú aplikáciu volaním express() a uložením jej návratovej hodnoty do aplikácie premenlivý. Potom počúva prevádzku na porte 3000 zavolaním na počúvaj metóda na aplikácie objekt.
Krok 3: Vytvorenie obslužných programov trasy
Ďalej vytvorte nejaké obslužné nástroje trasy, na ktorých môžete implementovať riešenie obmedzujúce rýchlosť.
Najprv vytvorte priečinok, trasy, v koreňovom adresári projektu spustením:
trasy mkdir
Vytvorte súbor, routes.js, do priečinka trás a pridajte nasledujúci kód:
konšt vyjadriť = vyžadovať("expresné");
konšt router = expres. Router();router.get("/", (req, res) => {
res.send({ správa: "Dobrý deň, toto je žiadosť GET" });
});router.post("/add-demo", (req, res) => {
res.status (201).send({ správa: "Zdroj bol úspešne vytvorený" });
});router.put("/update-demo", (req, res) => {
res.status (201).send({ správa: "Zdroj bol úspešne aktualizovaný" });
});
modul.exportov = router;
Tento kód importuje expresné, volá Router metóda zapnutá expresnéa uloží hodnotu do premennej, router. The Router metóda vám umožňuje vytvárať modulárne, pripojiteľné obslužné nástroje smerovania. Môžete vytvoriť obslužné nástroje trasy pre a GET žiadosť o „/“, a POST žiadosť o „/add-demo“ a a PUT žiadosť o „/update-demo”. Nakoniec exportujte router premenlivý.
Ďalej importujte súbor router premenná vo vašom index.js súbor:
// index.js
konšt trasy = vyžadovať(./routes/routes");
Potom ho použite ako middleware v súbore index.js:
// index.js
aplikácie.použitie(trasy);
Nezabudnite umiestniť blok kódu vyššie pred app.počúvať hovor.
Krok 4: Implementácia obmedzenia sadzieb
Najprv vytvorte „middleware” priečinok v koreňovom adresári vášho projektu spustením:
middleware mkdir
Potom vytvorte súbor s názvom „rate-limiter.js” v adresári middlewaru. Do tohto súboru pridajte nasledujúci kód:
// rate-limiter.js
konšt rateLimiter = vyžadovať("limit expresnej sadzby");konšt obmedzovač = rateLimiter({
max: 5,
windowsMS: 10000, // 10 sekúnd
správa: "Môžeš'momentálne nepodávate žiadne ďalšie požiadavky. Skúste to znova neskôr",
});
modul.exportov = obmedzovač
The rateLimiter funkcia berie konfiguračný objekt s podmienkami na obmedzenie počtu požiadaviek.
Vlastnosti v objekte konfigurácie vyššie sú:
- max: Táto vlastnosť musí byť vždy a číslo alebo funkcia, ktorá vracia číslo. Predstavuje maximálny počet žiadostí, ktoré môže používateľ vykonať v určenom časovom rámci. Ak táto vlastnosť nie je nastavená v konfiguračnom objekte, je predvolená 5.
- windowsMS: Táto vlastnosť by mala byť vždy číslo. Predstavuje časový rámec, v ktorom je povolených niekoľko žiadostí milisekúnd. Ak táto vlastnosť nie je nastavená v konfiguračnom objekte, predvolene je nastavená na 60 000 milisekúnd (jedna minúta).
- správu: Táto vlastnosť môže byť a reťazec, objekt JSON alebo akákoľvek iná hodnota podporovaná Expresná odpoveď.odoslať metóda. Ak táto vlastnosť nie je nastavená v konfiguračnom objekte, predvolene sa nastaví na „Príliš veľa požiadaviek. Skúste neskôr prosím."
Funkcia potom skontroluje opakované požiadavky na vašu aplikáciu. Ak používateľ prekročí limit (max, 5) v časovom rámci (windowsMS, 10 s), zablokuje požiadavku. Vyvolá tiež chybu „Príliš veľa žiadostí“ so stavovým kódom 429.
Nakoniec importujte funkciu obmedzovača do svojho index.js súbor a aplikujte ho ako globálny middleware vo svojej aplikácii. Urobte to umiestnením app.use (obmedzovač) nad middleware trás. Toto aplikuje riešenie obmedzujúce rýchlosť na všetky trasy vašej aplikácie.
aplikácie.použitie(obmedzovač);
Špecifické trasy obmedzujúce rýchlosť
Môžete tiež použiť obmedzenie sadzieb na konkrétne trasy. Môžete ich nakonfigurovať samostatne na odmietnutie žiadostí podaných v inom časovom rámci, zobrazenie inej správy atď.
Predpokladajme napríklad, že vo svojej aplikácii implementujete trasu prihlásenia používateľa. Možno budete musieť pridať konfiguráciu obmedzujúcu rýchlosť pre prihlasovaciu cestu, ktorá sa líši od konfigurácie používanej inými trasami.
Najprv budete musieť odstrániť obmedzovač ako middleware na úrovni aplikácie a aplikujte ho, pretože v ExpressJS nie je zabudovaný systém filtrovania middlewaru. Takže aj keď do trasy pridáte konkrétne riešenie obmedzujúce rýchlosť, globálny middleware bude stále bežať na tejto trase.
Potom vytvorte novú konfiguráciu obmedzujúcu rýchlosť vo svojom rate-limiter.js súbor a exportujte ho.
konšt signInLimiter = rateLimiter({
max: 3,
windowsMS: 10000, //10 sekúnd
správa: "Príliš veľa pokusov o prihlásenie. Skúste to znova neskôr."
})
modul.exportov = {
obmedzovač,
signInLimiter
}
The signInLimiter konfiguračný objekt má iný počet max požiadavky a iné chybové hlásenie od všeobecného obmedzovača rýchlosti.
Nakoniec aktualizujte svoj router.js súbor s blokom kódu nižšie:
// router.js
konšt vyjadriť = vyžadovať("expresné");
konšt router = expres. Router();
konšt {limiter, signInLimiter} = vyžadovať(../middleware/rate-limiter)router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ správa: "Dobrý deň, toto je žiadosť GET" });
});router.použitie(obmedzovač)
router.post("/post", (req, res) => {
res.status (201).send({ správa: "Zdroj bol úspešne vytvorený" });
});router.put("/put", (req, res) => {
res.status (201).send({ správa: "Zdroj bol úspešne aktualizovaný" });
});
modul.exportov = router;
V bloku kódu vyššie ste importovali obmedzovač a signInLimiter. Potom si podal žiadosť signInLimiter ako špecifický obmedzovač rýchlosti na „/sign-in“trasa.
Nakoniec umiestnením router.use (obmedzovač) nad ostatnými trasami ste použili obmedzovač ako obmedzovač rýchlosti pre zvyšok trás.
Význam obmedzovania sadzieb
Obmedzenie rýchlosti znižuje zaťaženie vášho webového servera tým, že nemusíte spracovávať príliš veľa požiadaviek naraz. Znižuje aktivitu robotov, chráni vás pred útokmi DoS (Denial of Service) a zabraňuje útokom hrubou silou.