Kiiruse piiramine on strateegia, mida saate kasutada võrguliikluse juhtimiseks. See piirab taotluste arvu, mida kasutaja saab teatud aja jooksul teha.
On olemas mitmesuguseid kiirust piiravaid algoritme, millest igaühel on oma kompromissid. Üks lihtne ja populaarne meetod on päringute IP-aadresside jälgimine ja päringute vahelise aja kontrollimine. Süsteem saab seejärel päringu tagasi lükata, kui selle IP-aadress ületab piiranguga lubatud päringute arvu.
Seda kiiruse piiramise lähenemisviisi on NodeJS-Expressi rakenduses lihtne luua vaid mõne sammuga.
1. samm: arenduskeskkonna seadistamine
Esiteks peate looma ja lähtestama Expressi rakenduse.
Alustage projektikataloogi loomisega, käivitades:
mkdir express-app
Seejärel sisestage see kataloog, käivitades:
cd ekspress-rakendus
Järgmiseks initsialiseerige npm, sõlme paketihaldur, ja luua a package.json faili oma rakenduses, käivitades:
npm init -y
The -y lipp loob teie package.json faili kõigi vaikeseadetega.
Järgmisena peate installima mõned sõltuvused. Selle õpetuse jaoks vajalikud sõltuvused on järgmised:
- ExpressJS: ExpressJS on NodeJS-i raamistik mis pakub veebi- ja mobiilirakenduste jaoks tugevat funktsioonide komplekti. See lihtsustab NodeJS-iga taustarakenduste loomise protsessi.
- Kiirmäära piirmäär: Expressi kiiruspiirang on ExpressJS-i kiirust piirav vahevara. See piirab korduvaid päringuid avalike API-de ja/või lõpp-punktidega, nagu parooli lähtestamine, kasutajate sisselogimine jne.
Installige vajalikud sõltuvused, käivitades:
npm installida kiirkiir-piiri
2. samm: kiirrakenduse loomine
Peate looma lihtsa Expressi serveri, mis kuulab teie rakendusele esitatud päringuid.
Esiteks looge an index.js faili oma projekti juurkataloogis. See on teie taotluse sisestusfail.
Järgmisena lisage omale järgmine kood index.js fail:
// index.js
konst väljendada = nõuda("ekspress");
konst rakendus = express();
konst port = protsess.env. PORT || 3000
app.listen (port, () => {
konsool.log(`Rakendus töötab pordis ${port}`);
});
See kood impordib väljendada ja loob Express-rakenduse, kutsudes välja express() ja salvestades selle tagastusväärtuse faili rakendus muutuv. Seejärel kuulab see sadama liiklust 3000 helistades kuulake meetodil rakendus objektiks.
3. samm: marsruudihaldurite loomine
Järgmisena looge mõned marsruudihaldurid, milles saate kiirust piiravat lahendust rakendada.
Esmalt looge oma projekti juurkataloogis kaust, marsruudid, käivitades:
mkdir marsruudid
Loo fail, routes.js, marsruutide kausta ja lisage järgmine kood:
konst väljendada = nõuda("ekspress");
konst ruuter = ekspress. Ruuter ();ruuter.get("/", (req, res) => {
res.send({ sõnum: "Tere, see on GET-i taotlus" });
});ruuter.post("/add-demo", (req, res) => {
res.status (201).send({ sõnum: "Ressursi loomine õnnestus" });
});ruuter.put("/update-demo", (req, res) => {
res.status (201).send({ sõnum: "Ressursi värskendamine õnnestus" });
});
moodul.eksporti = ruuter;
See kood impordib väljendada, kutsub üles Ruuter meetod sisse lülitatud väljendadaja salvestab väärtuse muutujas, ruuter. The Ruuter meetod võimaldab teil luua modulaarseid, monteeritavaid marsruudikäsitlejaid. Saate luua marsruudihaldurid a jaoks SAADA taotleda "/”, a POSTITA taotleda "/add-demo”, ja a PANGE taotleda "/update-demo”. Lõpuks eksportige ruuter muutuv.
Järgmisena importige ruuter muutuja teie index.js fail:
// index.js
konst marsruudid = nõuda(./marsruudid/marsruudid");
Seejärel kasutage seda vahevarana failis index.js:
// index.js
rakendus.kasutada(marsruute);
Kindlasti asetage koodiplokk ülalt enne rakendus.kuula helistama.
4. etapp: määra piiramise rakendamine
Esiteks looge "vahevara” kausta oma projekti juurkataloogis, käivitades:
mkdir vahevara
Seejärel looge fail nimega "rate-limiter.js” vahevara kataloogis. Lisage sellele failile järgmine kood:
// rate-limiter.js
konst rateLimiter = nõuda("kiirlimiit");konst piiraja = rateLimiter({
max: 5,
windowMS: 10000, // 10 sekundit
sõnum: "Sa saad'ei tee hetkel rohkem taotlusi. Proovige hiljem uuesti",
});
moodul.eksporti = piiraja
The rateLimiter funktsioon võtab päringute arvu piiramiseks konfiguratsiooniobjekti tingimustega.
Ülaltoodud konfiguratsiooniobjekti omadused on järgmised:
- max: See omadus peab alati olema a number või funktsioon, mis tagastab numbri. See näitab maksimaalset taotluste arvu, mida kasutaja saab teatud aja jooksul teha. Kui see atribuut ei ole konfiguratsiooniobjektis määratud, on see vaikimisi 5.
- windowsMS: see atribuut peaks alati olema arv. See tähistab ajavahemikku, mille jooksul on lubatud mitu päringut millisekundid. Kui seda atribuuti ei ole konfiguratsiooniobjektis määratud, on see vaikimisi 60 000 millisekundit (üks minut).
- sõnum: See omadus võib olla a string, JSON-objekt või mõni muu väärtus, mida toetab Ekspressi vastus.saata meetod. Kui seda atribuuti ei ole konfiguratsiooniobjektis määratud, on selle vaikeväärtus "Liiga palju taotlusi. Palun proovi hiljem uuesti."
Seejärel kontrollib funktsioon teie rakendusele korduvaid taotlusi. Kui kasutaja ületab limiiti (max, 5) aja jooksul (windowsMS, 10s), blokeerib see päringu. Samuti kuvatakse tõrketeade "Liiga palju taotlusi" olekukoodiga 429.
Lõpuks importige oma seadmesse piiraja funktsioon index.js faili ja rakendage seda oma rakenduses globaalse vahevarana. Tehke seda asetades app.use (piiraja) marsruutide vahevara kohal. See rakendab kiirust piiravat lahendust kõigile teie rakenduse marsruutidele.
rakendus.kasutada(piiraja);
Hinda piiravad konkreetsed marsruudid
Samuti saate konkreetsetele marsruutidele rakendada hinnapiirangut. Saate neid eraldi konfigureerida, et keelduda teises ajavahemikus tehtud taotlustest, kuvada teistsugust sõnumit jne.
Oletame näiteks, et rakendate oma rakenduses kasutaja sisselogimismarsruuti. Võimalik, et peate sisselogimismarsruudi jaoks lisama kiirust piirava konfiguratsiooni, mis erineb teiste marsruutide konfiguratsioonist.
Esiteks peate eemaldama piiraja rakendustaseme vahevarana ja rakendage seda, kuna ExpressJS-is pole sisseehitatud vahevara filtrisüsteemi. Nii et isegi kui lisate marsruudile konkreetse kiirust piirava lahenduse, töötaks globaalne vahevara sellel marsruudil ikkagi.
Järgmisena looge oma seadmes uus kiirust piirav konfiguratsioon rate-limiter.js faili ja eksportige see.
konst signInLimiter = rateLimiter({
max: 3,
windowMS: 10000, //10 sekundit
sõnum: "Liiga palju sisselogimiskatseid. Proovige hiljem uuesti."
})
moodul.eksporti = {
piiraja,
signInLimiter
}
The signInLimiter konfiguratsiooniobjektil on erinev arv max päringud ja üldisest kiiruspiirangust erinev veateade.
Lõpuks värskendage oma ruuter.js fail alloleva koodiplokiga:
// ruuter.js
konst väljendada = nõuda("ekspress");
konst ruuter = ekspress. Ruuter ();
konst {limiter, signInLimiter} = nõuda("../middleware/rate-limiter")ruuter.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ sõnum: "Tere, see on GET-i taotlus" });
});ruuter.kasutada(piiraja)
ruuter.post("/post", (req, res) => {
res.status (201).send({ sõnum: "Ressursi loomine õnnestus" });
});ruuter.put("/put", (req, res) => {
res.status (201).send({ sõnum: "Ressursi värskendamine õnnestus" });
});
moodul.eksporti = ruuter;
Ülaltoodud koodiplokis importisite piiraja ja signInLimiter. Siis kandideerisid signInLimiter konkreetse kiiruse piirajana/sign-in" tee.
Lõpuks asetades ruuter.use (piiraja) ülejäänud marsruutide kohal kasutasite ülejäänud marsruutidele kiiruse piirajana piirajat.
Maksumäära piiramise tähtsus
Kiiruse piiramine vähendab teie veebiserveri pinget, vältides liiga paljude päringute korraga töötlemist. See vähendab robotite aktiivsust, kaitseb teid teenuse keelamise (DoS) rünnakute eest ja hoiab ära toore jõu rünnakud.