Ինչպես գնահատել Limit Express հավելվածները
Գնահատման սահմանափակումը պաշտպանում է ծառայությունը ծանրաբեռնվածությունից: Բացահայտեք Express-rate-limit փաթեթը և ինչպես այն կարող է բարելավել ձեր հավելվածները:
Գնահատման սահմանափակումը ռազմավարություն է, որը կարող եք օգտագործել ցանցում երթևեկությունը վերահսկելու համար: Այն սահմանափակում է հարցումների քանակը, որոնք օգտվողը կարող է կատարել որոշակի ժամկետում:
Գոյություն ունեն տոկոսադրույքի սահմանափակման տարբեր ալգորիթմներ, որոնցից յուրաքանչյուրն ունի իր փոխզիջումները: Պարզ և հանրաճանաչ եղանակներից մեկն է՝ հետևել հարցումների IP հասցեներին և ստուգել, թե որքան ժամանակ է անցնում հարցումների միջև: Այնուհետև համակարգը կարող է մերժել հարցումը, եթե նրա IP հասցեն գերազանցում է սահմանաչափի թույլատրված հարցումների քանակը:
Գնահատման սահմանափակման այս մոտեցումը հեշտ է կառուցել NodeJS-Express հավելվածում՝ ընդամենը մի քանի քայլով:
Քայլ 1. Զարգացման միջավայրի ստեղծում
Նախ, դուք պետք է ստեղծեք և սկզբնավորեք Express հավելված:
Սկսեք ստեղծելով նախագծի գրացուցակ՝ գործարկելով.
mkdir express-app
Այնուհետև մուտքագրեք այդ գրացուցակը՝ գործարկելով.
cd express-app
Այնուհետև նախաստորագրեք npm-ը՝ հանգույցի փաթեթների կառավարիչը, և ձեր հավելվածում ստեղծեք package.json ֆայլ՝ գործարկելով.
npm init -y
-y դրոշը կստեղծի ձեր package.json ֆայլը՝ բոլոր լռելյայն կարգավորումներով:
Հաջորդը, դուք պետք է տեղադրեք որոշ կախվածություններ: Այս ձեռնարկի համար պահանջվող կախվածություններն են.
- ExpressJS. ExpressJS-ը NodeJS-ի շրջանակ է, որն ապահովում է վեբ և բջջային հավելվածների համար նախատեսված գործառույթների հզոր շարք: Այն հեշտացնում է NodeJS-ի հետ backend հավելվածների ստեղծման գործընթացը:
- Էքսպրես տոկոսադրույքի սահմանաչափ. Էքսպրես տոկոսադրույքի սահմանաչափը ExpressJS-ի համար փոխարժեքը սահմանափակող միջին ծրագիր է: Այն սահմանափակում է կրկնվող հարցումները հանրային API-ներով և/կամ վերջնակետերով, ինչպիսիք են գաղտնաբառի վերակայումը, օգտատերերի մուտքերը և այլն:
Տեղադրեք անհրաժեշտ կախվածությունները՝ գործարկելով.
npm install express express-rate-limit
Քայլ 2. Էքսպրես հավելվածի ստեղծում
Դուք պետք է ստեղծեք հիմնական Էքսպրես սերվեր, որը լսում է ձեր դիմումին ներկայացվող հարցումները:
Նախ, ձեր նախագծի արմատական գրացուցակում ստեղծեք index.js ֆայլ: Սա կլինի ձեր դիմումի մուտքի ֆայլը:
Այնուհետև ավելացրեք հետևյալ կոդը ձեր index.js ֆայլում.
// index.js
const express = require("express");
const app = express();
const port = process.env.PORT || 3000
app.listen(port, () => {
console.log(`App running on port ${port}`);
});
Այս կոդը ներմուծում է express և ստեղծում Էքսպրես հավելված՝ կանչելով express() և դրա վերադարձի արժեքը պահելով app փոփոխականում: Այնուհետև այն լսում է երթևեկությունը 3000 նավահանգստում` զանգահարելով լսել մեթոդը app օբյեկտի վրա:
Քայլ 3. Երթուղու կարգավորիչների ստեղծում
Հաջորդը, ստեղծեք մի քանի երթուղի մշակողներ, որոնց վրա կարող եք կիրառել տոկոսադրույքի սահմանափակող լուծումը:
Նախ, ձեր նախագծի արմատական գրացուցակում ստեղծեք թղթապանակ, երթուղիներ՝ գործարկելով.
mkdir routes
Ստեղծեք ֆայլ՝ routes.js ձեր երթուղիների թղթապանակում և ավելացրեք հետևյալ կոդը.
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
res.send({ message: "Hello, this is a GET request" });
});
router.post("/add-demo", (req, res) => {
res.status(201).send({ message: "Resource created successfully" });
});
router.put("/update-demo", (req, res) => {
res.status(201).send({ message: "Resource updated sucessfully" });
});
module.exports = router;
Այս կոդը ներմուծում է express, կանչում է Router մեթոդը express-ում և պահում արժեքը փոփոխականում՝ երթուղիչ: Router մեթոդը թույլ է տալիս ստեղծել մոդուլային, մոնտաժվող երթուղիների մշակիչներ: Դուք կարող եք ստեղծել երթուղիների մշակիչներ GET հարցումը «/», POST հարցումը «/add-demo»: >», և ԴՐԵԼ հարցում «/update-demo»-ին: Վերջապես, արտահանեք երթուղիչ փոփոխականը:
Հաջորդը, ներմուծեք երթուղիչ փոփոխականը ձեր index.js ֆայլում՝
// index.js
const routes = require("./routes/routes");
Այնուհետև օգտագործեք այն որպես միջին ծրագիր ձեր index.js ֆայլում.
// index.js
app.use(routes);
Նախքան app.listen զանգը, անպայման տեղադրեք կոդի բլոկը վերևում:
Քայլ 4. Փոխարժեքի սահմանափակման իրականացում
Նախ, ձեր նախագծի արմատական գրացուցակում ստեղծեք «middleware» թղթապանակ՝ գործարկելով.
mkdir middleware
Այնուհետև միջին ծրագրի գրացուցակի ներսում ստեղծեք «rate-limiter.js» անունով ֆայլ: Այս ֆայլին ավելացրեք հետևյալ կոդը.
// rate-limiter.js
const rateLimiter = require("express-rate-limit");
const limiter = rateLimiter({
max: 5,
windowMS: 10000, // 10 seconds
message: "You can't make any more requests at the moment. Try again later",
});
module.exports = limiter
rateLimiter ֆունկցիան վերցնում է կազմաձևման օբյեկտ՝ պահանջների քանակը սահմանափակելու պայմաններով:
Վերևի կազմաձևման օբյեկտի հատկությունները հետևյալն են.
- max. այս հատկությունը միշտ պետք է լինի թիվ կամ ֆունկցիա, որը վերադարձնում է թիվ: Այն ներկայացնում է հարցումների առավելագույն քանակը, որը օգտվողը կարող է կատարել սահմանված ժամկետում: Եթե այս հատկությունը սահմանված չէ կազմաձևման օբյեկտում, ապա այն կանխադրված է 5:
- windowsMS. այս հատկությունը միշտ պետք է լինի թիվ: Այն ներկայացնում է այն ժամանակահատվածը, երբ մի քանի հարցումներ թույլատրվում են միլիվայրկյաններով: Եթե այս հատկությունը սահմանված չէ կազմաձևման օբյեկտում, ապա այն կանխադրված է 60000 միլիվայրկյան (մեկ րոպե):
- հաղորդագրություն. այս հատկությունը կարող է լինել string, JSON օբյեկտ կամ ցանկացած այլ արժեք, որն ապահովվում է Express-ի answer.send մեթոդով: Եթե այս հատկությունը սահմանված չէ կազմաձևման օբյեկտում, ապա այն կանխադրված է «Շատ շատ հարցումներ: Խնդրում եմ փորձեք մի փոքր ուշ."
Այնուհետև գործառույթը կստուգի ձեր դիմումին ուղղված կրկնվող հարցումների համար: Եթե օգտատերը գերազանցի սահմանաչափը (առավելագույնը, 5) ժամկետում (windowMS, 10 վ), այն կարգելափակի հարցումը: Այն նաև կներկայացնի «Շատ շատ հարցումներ» սխալ՝ 429 կարգավիճակի կոդով:
Ի վերջո, ներմուծեք սահմանափակիչ գործառույթը ձեր index.js ֆայլում և կիրառեք այն որպես գլոբալ միջին ծրագիր ձեր հավելվածում: Դա արեք՝ տեղադրելով app.use(limiter) երթուղիների միջին ծրագրի վերևում: Սա կիրառում է տոկոսադրույքը սահմանափակող լուծումը ձեր հավելվածի բոլոր երթուղիների համար:
app.use(limiter);
Գնահատման սահմանափակող հատուկ երթուղիներ
Դուք կարող եք նաև կիրառել սակագների սահմանափակում որոշակի երթուղիների համար: Դուք կարող եք դրանք կարգավորել առանձին՝ այլ ժամկետներում արված հարցումները մերժելու, այլ հաղորդագրություն ցուցադրելու և այլնի համար:
Օրինակ, ենթադրենք, որ ձեր հավելվածում կիրառում եք օգտվողի մուտքի երթուղի: Հնարավոր է, որ ձեզ անհրաժեշտ լինի մուտքի երթուղու համար ավելացնել փոխարժեքը սահմանափակող կոնֆիգուրացիա, որը տարբերվում է մյուս երթուղիների կողմից օգտագործվող կազմաձևից:
Նախ, դուք պետք է հեռացնեք սահմանափակիչը որպես հավելվածի մակարդակի միջին ծրագիր և կիրառեք այն, քանի որ ExpressJS-ում ներկառուցված միջին ծրագրային զտիչ համակարգ չկա: Այսպիսով, նույնիսկ եթե դուք երթուղու վրա ավելացնեք որոշակի տոկոսադրույքը սահմանափակող լուծում, համաշխարհային միջին ծրագիրը դեռ կաշխատի այդ երթուղու վրա:
Հաջորդը, ձեր rate-limiter.js ֆայլում ստեղծեք նոր փոխարժեքը սահմանափակող կոնֆիգուրացիա և արտահանեք այն:
const signInLimiter = rateLimiter({
max: 3,
windowMS: 10000, //10 seconds
message: "Too many sign-in attempts. Try again later."
})
module.exports = {
limiter,
signInLimiter
}
signInLimiter կազմաձևման օբյեկտն ունի տարբեր քանակի առավելագույնը հարցումներ և սխալի այլ հաղորդագրություն ընդհանուր տոկոսադրույքի սահմանափակիչից:
Ի վերջո, թարմացրեք ձեր router.js ֆայլը ստորև բերված կոդի բլոկով.
// router.js
const express = require("express");
const router = express.Router();
const {limiter, signInLimiter} = require("../middleware/rate-limiter")
router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ message: "Hello, this is a GET request" });
});
router.use(limiter)
router.post("/post", (req, res) => {
res.status(201).send({ message: "Resource created successfully" });
});
router.put("/put", (req, res) => {
res.status(201).send({ message: "Resource updated sucessfully" });
});
module.exports = router;
Վերևի կոդի բլոկում դուք ներմուծել եք սահմանափակիչ և signInLimiter: Այնուհետև դուք կիրառեցիք signInLimiter որպես որոշակի տոկոսադրույքի սահմանափակում «/-ի վրա: մուտք» երթուղին:
Վերջապես, տեղադրելով router.use(limiter) մնացած երթուղիների վերևում, դուք կիրառեցիք սահմանափակիչը որպես տոկոսադրույքի սահմանափակում մնացած երթուղիների համար:
Գնահատման սահմանափակման կարևորությունը
Գնահատման սահմանափակումը նվազեցնում է ձեր վեբ սերվերի լարվածությունը՝ խուսափելով միաժամանակ չափազանց շատ հարցումներ մշակելուց: Այն նվազեցնում է բոտերի ակտիվությունը, պաշտպանում է ձեզ ծառայության մերժման (DoS) հարձակումներից և կանխում է բիրտ ուժի հարձակումները: