A sebességkorlátozás egy olyan stratégia, amelyet a hálózat forgalmának szabályozására használhat. Korlátozza a felhasználó által adott időkereten belül benyújtható kérések számát.
Különféle sebességkorlátozó algoritmusok léteznek, mindegyiknek megvan a maga kompromisszuma. Az egyik egyszerű és népszerű módszer a kérések IP-címének nyomon követése és annak ellenőrzése, hogy mennyi idő telik el a kérések között. A rendszer ezután visszautasíthat egy kérést, ha annak IP-címe meghaladja a korlát által megengedett kérések számát.
Ez a sebességkorlátozási megközelítés néhány lépéssel egyszerűen beépíthető egy NodeJS-Express alkalmazásba.
1. lépés: Fejlesztési környezet beállítása
Először létre kell hoznia és inicializálnia kell egy Express alkalmazást.
Kezdje a projektkönyvtár létrehozásával a következő futtatással:
mkdir express-app
Ezután lépjen be a könyvtárba a következő futtatással:
CD express-app
Ezután inicializálja npm, a csomóponti csomagkezelő, és hozzon létre a package.json fájlt az alkalmazásban a következő futtatással:
npm init -y
Az -y zászló létrehozza az Ön package.json fájlt az összes alapértelmezett beállítással.
Ezután telepítenie kell néhány függőséget. Az oktatóanyaghoz szükséges függőségek a következők:
- ExpressJS: Az ExpressJS egy NodeJS keretrendszer amely robusztus funkciókészletet biztosít webes és mobilalkalmazásokhoz. Leegyszerűsíti a háttéralkalmazások NodeJS segítségével történő felépítésének folyamatát.
- Expressz Rate Limit: Az Express rate limit egy sebességkorlátozó köztes szoftver az ExpressJS számára. A nyilvános API-kra és/vagy végpontokra korlátozza az ismételt kéréseket, például a jelszó-visszaállítást, a felhasználói bejelentkezéseket stb.
Telepítse a szükséges függőségeket a következő futtatásával:
npm telepítés expressz gyorsdíjhatár
2. lépés: Expressz alkalmazás létrehozása
Létre kell hoznia egy alapszintű Expressz-kiszolgálót, amely figyeli az alkalmazására érkező kéréseket.
Először hozzon létre egy index.js fájlt a projekt gyökérkönyvtárában. Ez lesz a jelentkezésed beviteli fájlja.
Ezután adja hozzá a következő kódot a sajátjához index.js fájl:
// index.js
const expressz = igényelnek("Expressz");
const app = express();
const port = process.env. PORT || 3000
app.listen (port, () => {
konzol.log(`Porton futó alkalmazás ${port}`);
});
Ez a kód importál Expressz és létrehoz egy Express alkalmazást az express() meghívásával és a visszatérési értékének tárolásával a kb változó. Ezután figyeli a porton lévő forgalmat 3000 hívásával a hallgat módszer a kb tárgy.
3. lépés: Útvonalkezelők létrehozása
Ezután hozzon létre néhány útvonalkezelőt, amelyeken megvalósíthatja a sebességkorlátozó megoldást.
Először hozzon létre egy mappát, útvonalakat a projekt gyökérkönyvtárában a következő futtatással:
mkdir útvonalak
Hozzon létre egy fájlt, routes.js, az útvonalak mappájába, és adja hozzá a következő kódot:
const expressz = igényelnek("Expressz");
const router = expressz. Router();router.get("/", (req, res) => {
res.send({ üzenet: "Helló, ez egy GET kérés" });
});router.post("/add-demo", (req, res) => {
res.status (201).send({ üzenet: "Az erőforrás sikeresen létrehozva" });
});router.put("/update-demo", (req, res) => {
res.status (201).send({ üzenet: "Az erőforrás sikeresen frissítve" });
});
modult.export = router;
Ez a kód importál Expressz, hívja a Router módszer bekapcsolva Expressz, és az értéket egy változóban tárolja, router. Az Router módszer lehetővé teszi moduláris, felszerelhető útvonalkezelők létrehozását. Létrehozhat útvonalkezelőket a KAP kérni "/”, a POST kérni "/add-demo” és a PUT kérni "/update-demo”. Végül exportálja a router változó.
Ezután importálja a router változó a te index.js fájl:
// index.js
const útvonalak = igényelnek(./routes/routes");
Ezután használja köztes szoftverként az index.js fájlban:
// index.js
kb.használat(útvonalak);
Ügyeljen arra, hogy a fenti kódblokkot a app.hallgatni hívás.
4. lépés: A sebességkorlátozás végrehajtása
Először hozzon létre egy "köztes szoftver” mappába a projekt gyökérkönyvtárában a következő futtatással:
mkdir köztes szoftver
Ezután hozzon létre egy fájlt "rate-limiter.js” a köztes szoftver könyvtárban. Adja hozzá a következő kódot ehhez a fájlhoz:
// rate-limiter.js
const rateLimiter = igényelnek("express-rate-limit");const limiter = rateLimiter({
max: 5,
windowMS: 10000, // 10 másodperc
üzenet: "tudsz'jelenleg ne kérjen többet. Próbáld újra később",
});
modult.export = korlátozó
Az rateLimiter függvény egy konfigurációs objektumot vesz fel a feltételekkel, hogy korlátozza a kérések számát.
A fenti konfigurációs objektum tulajdonságai a következők:
- max: Ennek a tulajdonságnak mindig a szám vagy egy számot visszaadó függvény. Ez a felhasználó által adott időkereten belül benyújtható kérések maximális számát jelenti. Ha ez a tulajdonság nincs beállítva a konfigurációs objektumban, akkor az alapértelmezett érték 5.
- WindowsMS: Ennek a tulajdonságnak mindig számnak kell lennie. Azt az időtartamot jelöli, amelyen belül több kérés is megengedett ezredmásodperc. Ha ez a tulajdonság nincs beállítva a konfigurációs objektumban, akkor az alapértelmezett érték 60000 ezredmásodperc (egy perc).
- üzenet: Ez az ingatlan lehet a húr, egy JSON-objektum vagy bármely más által támogatott érték Express válasza.küld módszer. Ha ez a tulajdonság nincs beállítva a konfigurációs objektumban, akkor alapértelmezés szerint „Túl sok kérés. Kérlek, próbáld újra később."
A funkció ezután ellenőrzi, hogy nem érkezik-e ismétlődő kérés az alkalmazáshoz. Ha egy felhasználó túllépi a korlátot (max, 5) az időkereten belül (windowsMS, 10s), blokkolja a kérést. Ezenkívül „Túl sok kérés” hibát fog kiadni állapotkóddal 429.
Végül importálja a limiter funkciót a sajátjába index.js fájlt, és globális köztes szoftverként alkalmazza az alkalmazásban. Tegye ezt az elhelyezéssel app.use (korlátozó) az útvonalak köztes szoftvere felett. Ez a díjkorlátozó megoldást alkalmazza az alkalmazás összes útvonalára.
kb.használat(korlátozó);
Díjkorlátozó meghatározott útvonalak
Adott útvonalakra díjkorlátozást is alkalmazhat. Külön beállíthatja őket, hogy elutasítsák a különböző időkeretben benyújtott kéréseket, más üzenetet jelenítsenek meg stb.
Tegyük fel például, hogy egy felhasználói bejelentkezési útvonalat valósít meg az alkalmazásban. Előfordulhat, hogy a bejelentkezési útvonalhoz olyan sebességkorlátozó konfigurációt kell hozzáadnia, amely eltér a többi útvonal által használt konfigurációtól.
Először is el kell távolítania korlátozó alkalmazásszintű köztes szoftverként, és alkalmazza, mert az ExpressJS-ben nincs beépített köztes szoftverszűrő rendszer. Tehát még ha egy adott díjkorlátozó megoldást is hozzáad egy útvonalhoz, a globális köztes szoftver továbbra is futni fog ezen az útvonalon.
Ezután hozzon létre egy új sebességkorlátozó konfigurációt az Ön számára rate-limiter.js fájlt és exportálja azt.
const signInLimiter = rateLimiter({
max: 3,
windowMS: 10000, //10 másodperc
üzenet: "Túl sok bejelentkezési kísérlet. Próbáld újra később."
})
modult.export = {
korlátozó,
signInLimiter
}
Az signInLimiter konfigurációs objektumnak különböző száma van max kéréseket és az általános sebességkorlátozótól eltérő hibaüzenetet.
Végül frissítse router.js fájl az alábbi kódblokkkal:
// router.js
const expressz = igényelnek("Expressz");
const router = expressz. Router();
const {limiter, signInLimiter} = igényelnek("../middleware/rate-limiter")router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ üzenet: "Helló, ez egy GET kérés" });
});router.használat(korlátozó)
router.post("/post", (req, res) => {
res.status (201).send({ üzenet: "Az erőforrás sikeresen létrehozva" });
});router.put("/put", (req, res) => {
res.status (201).send({ üzenet: "Az erőforrás sikeresen frissítve" });
});
modult.export = router;
A fenti kódblokkban importált korlátozó és signInLimiter. Aztán jelentkeztél signInLimiter a „/sign-in” útvonalon.
Végül az elhelyezéssel router.use (limiter) a többi útvonal felett korlátozót alkalmazott sebességkorlátozóként a többi útvonalra.
A mértékkorlátozás jelentősége
A sebességkorlátozás csökkenti a webszerver megterhelését, mivel elkerüli, hogy túl sok kérést kelljen egyszerre feldolgoznia. Csökkenti a botaktivitást, megvédi Önt a szolgáltatásmegtagadási (DoS) támadásoktól, és megakadályozza a brute force támadásokat.