Ātruma ierobežošana ir stratēģija, ko varat izmantot, lai kontrolētu trafiku tīklā. Tas ierobežo pieprasījumu skaitu, ko lietotājs var veikt noteiktā laika posmā.

Pastāv dažādi ātrumu ierobežojoši algoritmi, katram no kuriem ir savi kompromisi. Viena vienkārša un populāra metode ir izsekot pieprasījumu IP adreses un pārbaudīt, cik daudz laika paiet starp pieprasījumiem. Sistēma pēc tam var noraidīt pieprasījumu, ja tās IP adrese pārsniedz limitā atļauto pieprasījumu skaitu.

Šo pieeju likmes ierobežošanai ir viegli izveidot lietotnē NodeJS-Express, veicot tikai dažas darbības.

1. darbība: izstrādes vides iestatīšana

Pirmkārt, jums būs jāizveido un jāinicializē Express lietojumprogramma.

Sāciet, izveidojot projekta direktoriju, izpildot:

mkdir express-app

Pēc tam ievadiet šo direktoriju, izpildot:

cd ekspress lietotne

Tālāk inicializējiet npm, mezgla pakotņu pārvaldnieks, un izveidot a pack.json failu savā lietojumprogrammā, izpildot:

npm init -y

The -y karogs radīs jūsu pack.json failu ar visiem noklusējuma iestatījumiem.

instagram viewer

Tālāk jums būs jāinstalē dažas atkarības. Šai apmācībai nepieciešamās atkarības ir:

  • ExpressJS: ExpressJS ir NodeJS ietvars kas nodrošina spēcīgu funkciju kopumu tīmekļa un mobilajām lietojumprogrammām. Tas vienkāršo aizmugurprogrammu veidošanas procesu, izmantojot NodeJS.
  • Ekspress likmes ierobežojums: Express likmes ierobežojums ir ExpressJS ātrumu ierobežojoša starpprogrammatūra. Tas ierobežo atkārtotus pieprasījumus uz publiskiem API un/vai galapunktiem, piemēram, paroles atiestatīšanu, lietotāju pieteikšanos utt.

Instalējiet nepieciešamās atkarības, izpildot:

npm uzstādīt ekspres-ierobežojums

2. darbība. Ātrās lietojumprogrammas izveide

Jums būs jāizveido pamata Express serveris, kas noklausās jūsu lietojumprogrammai nosūtītos pieprasījumus.

Vispirms izveidojiet an index.js failu sava projekta saknes direktorijā. Tas būs jūsu pieteikuma ievades fails.

Pēc tam pievienojiet tālāk norādīto kodu savam index.js fails:

// index.js
konst izteikt = pieprasīt("izteikt");
konst lietotne = express();
konst ports = process.env. OST || 3000

app.listen (port, () => {
konsole.log(`Lietotne darbojas portā ${port}`);
});

Šis kods tiek importēts izteikt un izveido Express lietojumprogrammu, izsaucot express() un saglabājot tās atgriešanas vērtību lietotne mainīgs. Pēc tam tas klausās satiksmi ostā 3000 zvanot uz klausies metode uz lietotne objektu.

3. darbība: maršruta apstrādātāju izveide

Pēc tam izveidojiet dažus maršruta apdarinātājus, kuros varat ieviest ātruma ierobežošanas risinājumu.

Vispirms izveidojiet mapi, maršrutus sava projekta saknes direktorijā, izpildot:

mkdir maršruti

Izveidot failu, routes.js, mapē maršruti un pievienojiet šādu kodu:

konst izteikt = pieprasīt("izteikt");
konst maršrutētājs = ekspress. Maršrutētājs ();

router.get("/", (req, res) => {
res.send({ ziņa: "Sveiki, šis ir GET pieprasījums" });
});

router.post("/add-demo", (req, res) => {
res.status (201).send({ message: "Resurss veiksmīgi izveidots" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ message: "Resurss ir veiksmīgi atjaunināts" });
});

modulis.eksportu = maršrutētājs;

Šis kods tiek importēts izteikt, aicina Maršrutētājs metode ieslēgta izteikt, un saglabā vērtību mainīgajā, maršrutētājs. The Maršrutētājs metode ļauj izveidot modulārus, uzstādāmus maršruta apstrādātājus. Varat izveidot maršruta apstrādātājus a GŪT pieprasīt "/”, a POSTĪT pieprasīt "/add-demo”, un a PUT pieprasīt "/update-demo”. Visbeidzot, eksportējiet maršrutētājs mainīgs.

Pēc tam importējiet maršrutētājs mainīgs jūsu index.js fails:

// index.js
konst maršruti = pieprasīt(./maršruti/maršruti");

Pēc tam izmantojiet to kā starpprogrammatūru failā index.js:

// index.js
lietotne.izmantot(maršrutos);

Noteikti ievietojiet koda bloku iepriekš pirms app.klausīt zvanu.

4. darbība: likmes ierobežošanas ieviešana

Vispirms izveidojiet "starpprogrammatūra” mapi sava projekta saknes direktorijā, izpildot:

mkdir starpprogrammatūra

Pēc tam izveidojiet failu ar nosaukumu "rate-limiter.js” starpprogrammatūras direktorijā. Pievienojiet šim failam šādu kodu:

// rate-limiter.js
konst likmeLimiter = pieprasīt("ekspress likmes ierobežojums");

konst ierobežotājs = rateLimiter({
maks.: 5,
windowMS: 10000, // 10 sekundes
ziņa: "Jūs varat'šobrīd nesniedziet vairāk pieprasījumu. Pamēģini vēlreiz vēlāk",
});

modulis.eksportu = ierobežotājs

The likmeLimiter funkcija aizņem konfigurācijas objektu ar nosacījumiem, lai ierobežotu pieprasījumu skaitu.

Iepriekš minētā konfigurācijas objekta rekvizīti ir:

  • maks: šim īpašumam vienmēr ir jābūt a numuru vai funkcija, kas atgriež skaitli. Tas atspoguļo maksimālo pieprasījumu skaitu, ko lietotājs var veikt noteiktā laika posmā. Ja šis rekvizīts nav iestatīts konfigurācijas objektā, tas tiek iestatīts pēc noklusējuma 5.
  • windowsMS: šim īpašumam vienmēr ir jābūt skaitlim. Tas atspoguļo laika periodu, kurā ir atļauti vairāki pieprasījumi milisekundes. Ja šis rekvizīts nav iestatīts konfigurācijas objektā, tā noklusējuma vērtība ir 60 000 milisekundes (viena minūte).
  • ziņa: Šis īpašums var būt a virkne, JSON objektu vai jebkuru citu vērtību, ko atbalsta Express atbilde.nosūtīt metodi. Ja šis rekvizīts nav iestatīts konfigurācijas objektā, tā noklusējuma vērtība ir “Pārāk daudz pieprasījumu. Lūdzu, pamēģiniet vēlreiz vēlāk."

Pēc tam funkcija pārbaudīs, vai jūsu lietojumprogrammai nav saņemti atkārtoti pieprasījumi. Ja lietotājs pārsniedz limitu (maks, 5) laika posmā (windowsMS, 10s), tas bloķēs pieprasījumu. Tas arī parādīs kļūdu “Pārāk daudz pieprasījumu” ar statusa kodu 429.

Visbeidzot, savā ierīcē importējiet ierobežotāja funkciju index.js failu un lietojiet to kā globālu starpprogrammatūru savā lietojumprogrammā. Dariet to, ievietojot app.use (ierobežotājs) virs maršruta starpprogrammatūras. Tas attiecas uz ātruma ierobežošanas risinājumu visiem jūsu lietojumprogrammas maršrutiem.

lietotne.izmantot(ierobežotājs);

Likmes ierobežojošie īpašie maršruti

Varat arī piemērot tarifu ierobežojumus konkrētiem maršrutiem. Varat tos konfigurēt atsevišķi, lai noraidītu pieprasījumus, kas veikti citā laika posmā, parādītu citu ziņojumu utt.

Piemēram, pieņemsim, ka savā lietojumprogrammā ieviešat lietotāja pierakstīšanās maršrutu. Iespējams, pierakstīšanās maršrutam būs jāpievieno ātruma ierobežojoša konfigurācija, kas atšķiras no konfigurācijas, ko izmanto citi maršruti.

Pirmkārt, jums būs jānoņem ierobežotājs kā lietojumprogrammas līmeņa starpprogrammatūru un lietojiet to, jo ExpressJS nav iebūvētas starpprogrammatūras filtru sistēmas. Tātad, pat ja maršrutam pievienojat konkrētu tarifu ierobežojošu risinājumu, globālā starpprogrammatūra joprojām darbosies šajā maršrutā.

Pēc tam savā ierīcē izveidojiet jaunu ātruma ierobežošanas konfigurāciju rate-limiter.js failu un eksportēt to.

konst signInLimiter = rateLimiter({
maks.: 3,
windowMS: 10000, //10 sekundes
ziņa: "Pārāk daudz pierakstīšanās mēģinājumu. Pamēģini vēlreiz vēlāk."
})

modulis.eksportu = {
ierobežotājs,
signInLimiter
}

The signInLimiter konfigurācijas objektam ir atšķirīgs skaits maks pieprasījumus un atšķirīgu kļūdas ziņojumu no vispārējā ātruma ierobežotāja.

Visbeidzot, atjauniniet savu maršrutētājs.js failu ar zemāk esošo koda bloku:

// router.js
konst izteikt = pieprasīt("izteikt");
konst maršrutētājs = ekspress. Maršrutētājs ();
konst {limiter, signInLimiter} = pieprasīt(../middleware/rate-limiter)

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ ziņa: "Sveiki, šis ir GET pieprasījums" });
});

maršrutētājs.izmantot(ierobežotājs)

router.post("/post", (req, res) => {
res.status (201).send({ message: "Resurss veiksmīgi izveidots" });
});

router.put("/put", (req, res) => {
res.status (201).send({ message: "Resurss ir veiksmīgi atjaunināts" });
});

modulis.eksportu = maršrutētājs;

Iepriekš esošajā koda blokā jūs importējāt ierobežotājs un signInLimiter. Tad jūs pieteicāties signInLimiter kā īpašu ātruma ierobežotāju “/sign-in” maršruts.

Visbeidzot, ievietojot router.use (ierobežotājs) virs pārējiem maršrutiem jūs lietojāt ierobežotāju kā ātruma ierobežotāju pārējiem maršrutiem.

Likmes ierobežošanas nozīme

Ātruma ierobežošana samazina jūsu tīmekļa servera slodzi, izvairoties no pārāk daudzu pieprasījumu apstrādes vienlaikus. Tas samazina robotprogrammatūras darbību, aizsargā jūs no pakalpojuma atteikuma (DoS) uzbrukumiem un novērš brutālu spēku uzbrukumus.