Snelheidsbeperking is een strategie die u kunt gebruiken om het verkeer op een netwerk te controleren. Het beperkt het aantal verzoeken dat een gebruiker binnen een bepaald tijdsbestek kan doen.

Er bestaan ​​verschillende snelheidsbeperkende algoritmen, elk met zijn eigen afwegingen. Een eenvoudige en populaire methode is om de IP-adressen van verzoeken te volgen en te controleren hoeveel tijd er verstrijkt tussen verzoeken. Het systeem kan dan een verzoek weigeren als het IP-adres het aantal verzoeken overschrijdt dat de limiet toelaat.

Deze benadering van snelheidsbeperking is eenvoudig in een NodeJS-Express-app in te bouwen, met slechts een paar stappen.

Stap 1: Een ontwikkelomgeving opzetten

Eerst moet u een Express-toepassing maken en initialiseren.

Begin met het maken van een projectdirectory door het volgende uit te voeren:

mkdir express-app

Voer vervolgens die map in door uit te voeren:

CD express-app

Initialiseer vervolgens npm, de knooppuntpakketbeheerder, en maak een pakket.json bestand in uw toepassing door het volgende uit te voeren:

instagram viewer
npm init -y

De -y vlag zal je maken pakket.json bestand met alle standaardinstellingen.

Vervolgens moet u enkele afhankelijkheden installeren. De afhankelijkheden die nodig zijn voor deze zelfstudie zijn:

  • ExpressJS: ExpressJS is een NodeJS-framework dat een robuuste set functies biedt voor web- en mobiele applicaties. Het vereenvoudigt het proces van het bouwen van backend-applicaties met NodeJS.
  • Uitdrukkelijke tarieflimiet: Express rate limit is een snelheidsbeperkende middleware voor ExpressJS. Het beperkt herhaalde verzoeken tot openbare API's en/of eindpunten, zoals het opnieuw instellen van wachtwoorden, gebruikersaanmeldingen, enz.

Installeer de vereiste afhankelijkheden door het volgende uit te voeren:

npm installeren express express-tarief-begrenzing

Stap 2: Een Express-toepassing maken

U moet een standaard Express-server maken die luistert naar verzoeken die aan uw toepassing worden gedaan.

Maak eerst een index.js bestand in de hoofdmap van uw project. Dit wordt het invoerbestand voor uw aanvraag.

Voeg vervolgens de volgende code toe aan uw index.js het dossier:

// index.js
const express = vereisen("uitdrukken");
const app = express();
const poort = proces.env. HAVEN || 3000

app.luisteren (poort, () => {
troosten.log('App draait op poort' ${poort}`);
});

Deze code importeert uitdrukken en maakt een Express-toepassing door express() aan te roepen en de geretourneerde waarde op te slaan in de app variabel. Het luistert dan naar verkeer op poort 3000 door te bellen naar de luister methode op de app object.

Stap 3: Routehandlers maken

Maak vervolgens enkele route-handlers waarop u de snelheidsbeperkende oplossing kunt implementeren.

Maak eerst een map, routes, in de hoofdmap van uw project door het volgende uit te voeren:

mkdir-routes

Maak een bestand, routes.js, in je routesmap en voeg de volgende code toe:

const express = vereisen("uitdrukken");
const router = express. Router();

router.get("/", (req, res) => {
opnieuw.verzenden({ bericht: "Hallo, dit is een GET-verzoek" });
});

router.post("/add-demo", (req, res) => {
res.status (201).send({ bericht: "Bron succesvol aangemaakt" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ bericht: "Bron succesvol bijgewerkt" });
});

module.exporteert = router;

Deze code importeert uitdrukken, noemt de Router methode aan uitdrukken, en slaat de waarde op in een variabele, router. De Router methode kunt u modulaire, monteerbare routehandlers maken. U kunt routebehandelaars maken voor a KRIJGEN verzoek aan “/", a NA verzoek aan “/add-demo", en een LEGGEN verzoek aan “/update-demo”. Exporteer ten slotte de router variabel.

Importeer vervolgens de router variabele in je index.js het dossier:

// index.js
const routes = vereisen("./routes/routes");

Gebruik het vervolgens als middleware in uw index.js-bestand:

// index.js
app.gebruiken(routes);

Zorg ervoor dat u het codeblok hierboven plaatst vóór de app.luisteren telefoongesprek.

Stap 4: Snelheidsbeperking implementeren

Maak eerst een "middleware” map in de hoofdmap van uw project door het volgende uit te voeren:

mkdir middleware

Maak vervolgens een bestand met de naam "rate-limiter.js” in de middleware-directory. Voeg de volgende code toe aan dit bestand:

// rate-limiter.js
const rateLimiter = vereisen("express-tarief-limiet");

const limiter = rateLimiter({
maximaal: 5,
vensterMS: 10000, // 10 seconden
bericht: "Jij kan'doe momenteel geen verzoeken meer. Probeer het later opnieuw",
});

module.exporteert = begrenzer

De rateLimiter functie neemt een configuratieobject met de voorwaarden om het aantal verzoeken te beperken.

De eigenschappen in het bovenstaande configuratieobject zijn:

  • max: Deze eigenschap moet altijd een. zijn nummer of een functie die een getal retourneert. Het vertegenwoordigt het maximale aantal verzoeken dat een gebruiker binnen een opgegeven tijdsbestek kan doen. Als deze eigenschap niet is ingesteld in het configuratieobject, wordt deze standaard ingesteld op: 5.
  • windowsMS: Deze eigenschap moet altijd een getal zijn. Het vertegenwoordigt het tijdsbestek waarin verschillende verzoeken zijn toegestaan ​​in milliseconden. Als deze eigenschap niet is ingesteld in het configuratieobject, wordt deze standaard ingesteld op 60000 milliseconden (één minuut).
  • bericht: Deze eigenschap kan een snaar, een JSON-object of een andere waarde die wordt ondersteund door Reactie van Express.send methode. Als deze eigenschap niet is ingesteld in het configuratieobject, wordt deze standaard ingesteld op "Te veel verzoeken. Probeer het later opnieuw.”

De functie controleert vervolgens op herhaalde verzoeken aan uw toepassing. Als een gebruiker de limiet overschrijdt (max, 5) binnen het tijdsbestek (vensterMS, 10s), wordt het verzoek geblokkeerd. Het geeft ook een "Too Many Requests" -fout met een statuscode van 429.

Importeer ten slotte de limiter-functie in uw index.js bestand en pas het toe als een globale middleware in uw toepassing. Doe dit door het plaatsen van app.gebruik (limiter) boven de routes middleware. Dit past de snelheidsbeperkende oplossing toe op alle routes van uw applicatie.

app.gebruiken(begrenzer);

Tariefbeperkende specifieke routes

U kunt ook tariefbeperkingen toepassen op specifieke routes. U kunt ze afzonderlijk configureren om verzoeken die in een ander tijdsbestek zijn gedaan te weigeren, een ander bericht weer te geven, enz.

Stel bijvoorbeeld dat u een gebruikersaanmeldingsroute implementeert in uw toepassing. Mogelijk moet u een snelheidsbeperkende configuratie toevoegen voor de aanmeldingsroute die afwijkt van de configuratie die door de andere routes wordt gebruikt.

Eerst moet je verwijderen begrenzer als middleware op toepassingsniveau en pas het toe omdat er geen ingebouwd middleware-filtersysteem in ExpressJS is. Dus zelfs als u een specifieke snelheidsbeperkende oplossing aan een route toevoegt, zou de globale middleware nog steeds op die route draaien.

Maak vervolgens een nieuwe snelheidsbeperkende configuratie in uw rate-limiter.js bestand en exporteer het.

const signInLimiter = rateLimiter({
maximaal: 3,
vensterMS: 10000, //10 seconden
bericht: "Te veel aanmeldingspogingen. Probeer het later opnieuw."
})

module.exporteert = {
begrenzer,
signInLimiter
}

De signInLimiter configuratieobject heeft een ander aantal max verzoeken en een andere foutmelding dan de algemene snelheidsbegrenzer.

Werk ten slotte uw. bij router.js bestand met het onderstaande codeblok:

// router.js
const express = vereisen("uitdrukken");
const router = express. Router();
const {limiter, signInLimiter} = vereisen("../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (req, res, volgende) => {
opnieuw.verzenden({ bericht: "Hallo, dit is een GET-verzoek" });
});

router.gebruiken(begrenzer)

router.post("/post", (req, res) => {
res.status (201).send({ bericht: "Bron succesvol aangemaakt" });
});

router.put("/put", (req, res) => {
res.status (201).send({ bericht: "Bron succesvol bijgewerkt" });
});

module.exporteert = router;

In het codeblok hierboven heb je geïmporteerd begrenzer en aanmeldenInLimiter. Dan solliciteerde je signInLimiter als een specifieke snelheidsbegrenzer voor de “/sign-in” traject.

Tot slot, door het plaatsen van router.gebruik (limiter) boven de rest van de routes heb je limiter toegepast als snelheidsbegrenzer voor de rest van de routes.

Het belang van snelheidsbeperking

Snelheidsbeperking vermindert de belasting van uw webserver door te voorkomen dat u te veel verzoeken tegelijk moet verwerken. Het verlaagt de botactiviteit, beschermt u tegen Denial of Service (DoS)-aanvallen en voorkomt brute-force-aanvallen.