Hastighetsbegränsning är en strategi som du kan använda för att kontrollera trafiken på ett nätverk. Det begränsar antalet förfrågningar som en användare kan göra inom en viss tidsram.
Olika hastighetsbegränsande algoritmer finns, var och en med sina egna avvägningar. En enkel och populär metod är att spåra förfrågningars IP-adresser och kontrollera hur lång tid som går mellan förfrågningar. Systemet kan sedan neka en begäran om dess IP-adress överstiger antalet förfrågningar som gränsen tillåter.
Detta tillvägagångssätt för hastighetsbegränsning är lätt att bygga i en NodeJS-Express-app, med bara några få steg.
Steg 1: Skapa en utvecklingsmiljö
Först måste du skapa och initiera en Express-applikation.
Börja med att skapa en projektkatalog genom att köra:
mkdir express-app
Ange sedan den katalogen genom att köra:
CD express-app
Initiera sedan npm, nodpakethanteraren, och skapa en package.json fil i din applikation genom att köra:
npm init -y
De -y flaggan kommer att skapa din package.json fil med alla standardinställningar.
Därefter måste du installera vissa beroenden. De beroenden som krävs för denna handledning är:
- ExpressJS: ExpressJS är ett NodeJS-ramverk som ger en robust uppsättning funktioner för webb- och mobilapplikationer. Det förenklar processen att bygga backend-applikationer med NodeJS.
- Express Rate Limit: Express rate limit är en hastighetsbegränsande mellanprogramvara för ExpressJS. Det begränsar upprepade förfrågningar till offentliga API: er och/eller slutpunkter, såsom lösenordsåterställning, användarinloggning, etc.
Installera nödvändiga beroenden genom att köra:
npm Installera uttrycka express-begränsa
Steg 2: Skapa en Express-applikation
Du måste skapa en grundläggande Express-server som lyssnar på förfrågningar som görs till din applikation.
Skapa först en index.js filen i ditt projekts rotkatalog. Detta kommer att vara inmatningsfilen för din ansökan.
Lägg sedan till följande kod till din index.js fil:
// index.js
konst uttrycka = behöva("uttrycka");
konst app = express();
konst port = process.env. PORT || 3000
app.listen (port, () => {
trösta.logga(`App körs på port ${port}`);
});
Denna kod importerar uttrycka och skapar en Express-applikation genom att anropa express() och lagra dess returvärde i app variabel. Den lyssnar sedan efter trafik i hamn 3000 genom att ringa till lyssna metod på app objekt.
Steg 3: Skapa rutthanterare
Skapa sedan några rutthanterare som du kan implementera den hastighetsbegränsande lösningen på.
Skapa först en mapp, rutter, i ditt projekts rotkatalog genom att köra:
mkdir rutter
Skapa en fil, routes.js, i din ruttermapp och lägg till följande kod:
konst uttrycka = behöva("uttrycka");
konst router = express. Router();router.get("/", (req, res) => {
res.send({ meddelande: "Hej, detta är en GET-förfrågan" });
});router.post("/add-demo", (req, res) => {
res.status (201).send({ meddelande: "Resursen har skapats" });
});router.put("/update-demo", (req, res) => {
res.status (201).send({ meddelande: "Resursen har uppdaterats" });
});
modul.export = router;
Denna kod importerar uttrycka, kallar Router metod på uttrycka, och lagrar värdet i en variabel, router. De Router metoden låter dig skapa modulära, monterbara rutthanterare. Du kan skapa rutthanterare för en SKAFFA SIG begära att "/", a POSTA begära att "/add-demo", och en SÄTTA begära att "/update-demo”. Exportera slutligen router variabel.
Importera sedan router variabel i din index.js fil:
// index.js
konst rutter = behöva("./routes/routes");
Använd den sedan som mellanprogram i din index.js-fil:
// index.js
app.använda sig av(rutter);
Var noga med att placera kodblocket ovanför innan app.lyssna ringa upp.
Steg 4: Implementera prisbegränsning
Skapa först en "mellanprogram"-mappen i ditt projekts rotkatalog genom att köra:
mkdir mellanprogram
Skapa sedan en fil som heter "rate-limiter.js” i mellanprogramkatalogen. Lägg till följande kod till den här filen:
// rate-limiter.js
konst rateLimiter = behöva("express-rate-limit");konst limiter = rateLimiter({
max: 5,
windowMS: 10000, // 10 sekunder
meddelande: "Du kan'inte göra några fler förfrågningar just nu. Försök igen senare",
});
modul.export = begränsare
De rateLimiter funktion tar ett konfigurationsobjekt med villkoren för att begränsa antalet förfrågningar.
Egenskaperna i konfigurationsobjektet ovan är:
- max: Denna egenskap måste alltid vara en siffra eller en funktion som returnerar ett tal. Det representerar det maximala antalet förfrågningar en användare kan göra inom en angiven tidsram. Om den här egenskapen inte är inställd i konfigurationsobjektet är den som standard 5.
- windowsMS: Den här egenskapen ska alltid vara ett nummer. Det representerar tidsramen inom vilken flera förfrågningar tillåts millisekunder. Om den här egenskapen inte är inställd i konfigurationsobjektet, är den som standard 60 000 millisekunder (en minut).
- meddelande: Den här egenskapen kan vara en sträng, ett JSON-objekt eller något annat värde som stöds av Expresss svar.skicka metod. Om den här egenskapen inte är inställd i konfigurationsobjektet, har den som standard "För många förfrågningar. Vänligen försök igen senare."
Funktionen kommer sedan att leta efter upprepade förfrågningar till din applikation. Om en användare överskrider gränsen (max, 5) inom tidsramen (fönsterMS, 10s), blockerar den begäran. Det kommer också att skicka ett "Too Many Requests"-fel med en statuskod på 429.
Importera slutligen limiter-funktionen i din index.js fil och tillämpa den som en global mellanprogramvara i din applikation. Gör detta genom att placera app.use (begränsare) ovanför rutternas mellanprogram. Detta tillämpar den hastighetsbegränsande lösningen på alla din applikations rutter.
app.använda sig av(begränsare);
Prisbegränsande specifika rutter
Du kan också tillämpa prisbegränsning på specifika rutter. Du kan konfigurera dem separat för att avvisa förfrågningar som görs inom en annan tidsram, visa ett annat meddelande osv.
Anta till exempel att du implementerar en användarinloggningsväg i din applikation. Du kan behöva lägga till en hastighetsbegränsande konfiguration för inloggningsvägen som skiljer sig från den konfiguration som används av de andra rutterna.
Först måste du ta bort begränsare som mellanprogram på applikationsnivå och tillämpa det eftersom det inte finns något inbyggt filtersystem för mellanprogram i ExpressJS. Så även om du lägger till en specifik hastighetsbegränsande lösning till en rutt, skulle den globala mellanvaran fortfarande köras på den rutten.
Skapa sedan en ny hastighetsbegränsande konfiguration i din rate-limiter.js fil och exportera den.
konst signInLimiter = rateLimiter({
max: 3,
windowMS: 10000, //10 sekunder
meddelande: "För många inloggningsförsök. Försök igen senare."
})
modul.export = {
begränsare,
signInLimiter
}
De signInLimiter konfigurationsobjektet har ett annat antal max förfrågningar och ett annat felmeddelande från den allmänna hastighetsbegränsaren.
Äntligen, uppdatera din router.js fil med kodblocket nedan:
// router.js
konst uttrycka = behöva("uttrycka");
konst router = express. Router();
konst {limiter, signInLimiter} = behöva("../middleware/rate-limiter")router.get("/sign-in", signInLimiter, (req, res, nästa) => {
res.send({ meddelande: "Hej, detta är en GET-förfrågan" });
});router.använda sig av(begränsare)
router.post("/post", (req, res) => {
res.status (201).send({ meddelande: "Resursen har skapats" });
});router.put("/put", (req, res) => {
res.status (201).send({ meddelande: "Resursen har uppdaterats" });
});
modul.export = router;
I kodblocket ovan importerade du begränsare och signInLimiter. Sedan ansökte du signInLimiter som en specifik hastighetsbegränsare för "/sign-in" rutt.
Slutligen, genom att placera router.use (begränsare) ovanför resten av rutterna använde du limiter som hastighetsbegränsare för resten av rutterna.
Vikten av räntebegränsning
Taktbegränsning minskar belastningen på din webbserver genom att undvika att behöva behandla för många förfrågningar samtidigt. Det sänker botaktiviteten, skyddar dig från DoS-attacker (Denial of Service) och förhindrar brute-force-attacker.