Nopeuden rajoittaminen on strategia, jonka avulla voit hallita verkon liikennettä. Se rajoittaa pyyntöjen määrää, jonka käyttäjä voi tehdä tietyn ajan sisällä.
On olemassa erilaisia nopeutta rajoittavia algoritmeja, joista jokaisella on omat kompromissinsa. Yksi yksinkertainen ja suosittu tapa on seurata pyyntöjen IP-osoitteita ja tarkistaa, kuinka kauan pyyntöjen välillä kuluu aikaa. Järjestelmä voi sitten evätä pyynnön, jos sen IP-osoite ylittää rajan salliman pyyntöjen määrän.
Tämä nopeudenrajoitustapa on helppo rakentaa NodeJS-Express-sovellukseen vain muutamalla askeleella.
Vaihe 1: Kehitysympäristön määrittäminen
Ensin sinun on luotava ja alustettava Express-sovellus.
Aloita luomalla projektihakemisto suorittamalla:
mkdir express-sovellus
Siirry sitten kyseiseen hakemistoon suorittamalla:
CD pikasovellus
Seuraavaksi alusta npm, solmun pakettien hallinta, ja luo a package.json tiedosto sovelluksessasi suorittamalla:
npm init -y
The -y lippu luo sinun package.json tiedosto kaikilla oletusasetuksilla.
Seuraavaksi sinun on asennettava joitain riippuvuuksia. Tässä opetusohjelmassa vaadittavat riippuvuudet ovat:
- ExpressJS: ExpressJS on NodeJS-kehys joka tarjoaa vankan joukon ominaisuuksia verkko- ja mobiilisovelluksiin. Se yksinkertaistaa taustasovellusten rakentamisprosessia NodeJS: n avulla.
- Express Rate Limit: Express rate limit on nopeutta rajoittava väliohjelmisto ExpressJS: lle. Se rajoittaa toistuvat pyynnöt julkisiin API: ihin ja/tai päätepisteisiin, kuten salasanan nollauksiin, käyttäjien kirjautumisiin jne.
Asenna tarvittavat riippuvuudet suorittamalla:
npm Asentaa pikapika-raja
Vaihe 2: Luo pikasovellus
Sinun on luotava perus Express-palvelin, joka kuuntelee sovelluksellesi tehtyjä pyyntöjä.
Luo ensin index.js tiedosto projektisi juurihakemistoon. Tämä on hakemuksesi syöttötiedosto.
Lisää seuraavaksi seuraava koodi omaan index.js tiedosto:
// index.js
konst express = vaatia("ilmaista");
konst sovellus = express();
konst portti = process.env. SATAMA || 3000
app.listen (portti, () => {
konsoli.Hirsi(`Sovellus käynnissä portissa ${port}`);
});
Tämä koodi tuo ilmaista ja luo Express-sovelluksen kutsumalla express()-komentoa ja tallentamalla sen palautusarvon tiedostoon sovellus muuttuja. Sitten se kuuntelee sataman liikennettä 3000 soittamalla kuunnella menetelmällä sovellus esine.
Vaihe 3: Luo reittikäsittelijät
Luo seuraavaksi reitinkäsittelijöitä, joissa voit ottaa käyttöön nopeutta rajoittavan ratkaisun.
Luo ensin kansio, reitit, projektisi juurihakemistoon suorittamalla:
mkdir-reitit
Luo tiedosto, routes.js, reitit-kansioon ja lisää seuraava koodi:
konst express = vaatia("ilmaista");
konst reititin = express. Reititin();router.get("/", (req, res) => {
res.send({ viesti: "Hei, tämä on GET-pyyntö" });
});router.post("/add-demo", (req, res) => {
res.status (201).send({ viesti: "Resurssi luotu onnistuneesti" });
});router.put("/update-demo", (req, res) => {
res.status (201).send({ viesti: "Resurssi päivitetty onnistuneesti" });
});
moduuli.vientiä = reititin;
Tämä koodi tuo ilmaista, kutsuu Reititin menetelmä päällä ilmaistaja tallentaa arvon muuttujaan, reititin. The Reititin menetelmän avulla voit luoda modulaarisia, asennettavia reitinkäsittelijöitä. Voit luoda reitinkäsittelijöitä a SAADA pyytää "/”, a LÄHETTÄÄ pyytää "/add-demo”, ja a LAITTAA pyytää "/update-demo”. Vie lopuksi reititin muuttuja.
Tuo seuraavaksi reititin muuttuja sinun index.js tiedosto:
// index.js
konst reitit = vaatia(./routes/routes");
Käytä sitten sitä väliohjelmistona index.js-tiedostossasi:
// index.js
sovellus.käyttää(reitit);
Muista sijoittaa yllä oleva koodilohko ennen app.listen soittaa puhelimella.
Vaihe 4: Nopeuden rajoituksen käyttöönotto
Luo ensin "väliohjelmisto”-kansioon projektisi juurihakemistossa suorittamalla:
mkdir-väliohjelmisto
Luo sitten tiedosto nimeltä "rate-limiter.js” väliohjelmistohakemiston sisällä. Lisää tähän tiedostoon seuraava koodi:
// rate-limiter.js
konst rateLimiter = vaatia("pikaraja");konst rajoitin = rateLimiter({
max: 5,
windowMS: 10000, // 10 sekuntia
viesti: "Sinä pystyt'älä tee enempää pyyntöjä tällä hetkellä. Yritä myöhemmin uudelleen",
});
moduuli.vientiä = rajoitin
The rateLimiter toiminto ottaa määritysobjektin ehdoineen rajoittaakseen pyyntöjen määrää.
Yllä olevan konfigurointiobjektin ominaisuudet ovat:
- max: Tämän ominaisuuden on aina oltava a määrä tai funktio, joka palauttaa luvun. Se edustaa pyyntöjen enimmäismäärää, jonka käyttäjä voi tehdä tietyn ajan sisällä. Jos tätä ominaisuutta ei ole asetettu konfigurointiobjektissa, se on oletuksena 5.
- windowsMS: Tämän ominaisuuden tulee aina olla numero. Se edustaa ajanjaksoa, jonka kuluessa useita pyyntöjä sallitaan millisekuntia. Jos tätä ominaisuutta ei ole asetettu määritysobjektissa, sen oletusarvo on 60 000 millisekuntia (yksi minuutti).
- viesti: Tämä ominaisuus voi olla a merkkijono, JSON-objekti tai mikä tahansa muu tukema arvo Expressin vastaus.lähetä menetelmä. Jos tätä ominaisuutta ei ole asetettu konfigurointiobjektissa, sen oletusarvo on "Liian monta pyyntöä. Yritä uudelleen myöhemmin."
Toiminto tarkistaa sitten toistuvien pyyntöjen varalta sovelluksellesi. Jos käyttäjä ylittää rajan (max, 5) aikakehyksen sisällä (windowsMS, 10s), se estää pyynnön. Se antaa myös "Liian monta pyyntöä" -virheen tilakoodilla 429.
Tuo lopuksi rajoitintoiminto omaan index.js tiedosto ja käytä sitä globaalina väliohjelmistona sovelluksessasi. Tee tämä asettamalla app.use (rajoitin) reittien väliohjelmiston yläpuolella. Tämä koskee nopeutta rajoittavaa ratkaisua kaikille sovelluksesi reiteille.
sovellus.käyttää(rajoitin);
Hintaa rajoittavat tietyt reitit
Voit myös soveltaa hintarajoitusta tietyille reiteille. Voit määrittää ne erikseen hylkäämään eri aikavälillä tehdyt pyynnöt, näyttämään eri viestin jne.
Oletetaan esimerkiksi, että otat käyttäjän kirjautumisreitin käyttöön sovelluksessasi. Sinun on ehkä lisättävä sisäänkirjautumisreitille nopeutta rajoittava määritys, joka eroaa muiden reittien käyttämistä määrityksistä.
Ensin sinun on poistettava rajoitin sovellustason väliohjelmistona ja käytä sitä, koska ExpressJS: ssä ei ole sisäänrakennettua väliohjelmistosuodatinjärjestelmää. Joten vaikka lisäisit tietyn nopeutta rajoittavan ratkaisun reitille, globaali väliohjelmisto toimisi silti tällä reitillä.
Luo seuraavaksi uusi nopeutta rajoittava määritys rate-limiter.js tiedosto ja vie se.
konst signInLimiter = rateLimiter({
max: 3,
windowMS: 10000, //10 sekuntia
viesti: "Liian monta kirjautumisyritystä. Yritä myöhemmin uudelleen."
})
moduuli.vientiä = {
rajoitin,
signInLimiter
}
The signInLimiter määritysobjektilla on eri määrä max pyyntöjä ja yleisestä nopeudenrajoittimesta poikkeavan virheilmoituksen.
Päivitä lopuksi oma reititin.js tiedosto alla olevalla koodilohkolla:
// reititin.js
konst express = vaatia("ilmaista");
konst reititin = express. Reititin();
konst {limiter, signInLimiter} = vaatia("../middleware/rate-limiter")router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ viesti: "Hei, tämä on GET-pyyntö" });
});reititin.käyttää(rajoitin)
router.post("/post", (req, res) => {
res.status (201).send({ viesti: "Resurssi luotu onnistuneesti" });
});router.put("/put", (req, res) => {
res.status (201).send({ viesti: "Resurssi päivitetty onnistuneesti" });
});
moduuli.vientiä = reititin;
Yllä olevassa koodilohkossa toit rajoitin ja signInLimiter. Sitten hait signInLimiter erityisenä nopeudenrajoittimena "/sign-in" reitti.
Lopuksi asettamalla router.use (rajoitin) muiden reittien yläpuolella käytit rajoitinta nopeudenrajoittimena muille reiteille.
Koron rajoittamisen merkitys
Nopeuden rajoittaminen vähentää verkkopalvelimesi rasitusta välttämällä liian monta pyyntöä kerralla. Se vähentää botin toimintaa, suojaa sinua palvelunestohyökkäyksiltä (DoS) ja estää raa'an voiman hyökkäyksiä.