Ինչպես գնահատել 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) հարձակումներից և կանխում է բիրտ ուժի հարձակումները: