Ratenbegrenzung ist eine Strategie, mit der Sie den Datenverkehr in einem Netzwerk steuern können. Es begrenzt die Anzahl der Anfragen, die ein Benutzer innerhalb eines bestimmten Zeitrahmens stellen kann.

Es existieren verschiedene Ratenbegrenzungsalgorithmen, jeder mit seinen eigenen Kompromissen. Eine einfache und beliebte Methode besteht darin, die IP-Adressen von Anfragen zu verfolgen und zu überprüfen, wie viel Zeit zwischen Anfragen vergeht. Das System kann dann eine Anfrage ablehnen, wenn seine IP-Adresse die zulässige Anzahl von Anfragen überschreitet.

Dieser Ansatz zur Ratenbegrenzung lässt sich mit nur wenigen Schritten einfach in eine NodeJS-Express-App integrieren.

Schritt 1: Einrichten einer Entwicklungsumgebung

Zuerst müssen Sie eine Express-Anwendung erstellen und initialisieren.

Erstellen Sie zunächst ein Projektverzeichnis, indem Sie Folgendes ausführen:

mkdir Express-App

Geben Sie dann dieses Verzeichnis ein, indem Sie Folgendes ausführen:

CD Express-App

Als nächstes initialisieren

npm, der Node-Paketmanager, und erstellen Sie eine Paket.json Datei in Ihrer Anwendung, indem Sie Folgendes ausführen:

npm init -y

Das -y Flagge wird Ihre erstellen Paket.json Datei mit allen Standardeinstellungen.

Als nächstes müssen Sie einige Abhängigkeiten installieren. Die für dieses Tutorial erforderlichen Abhängigkeiten sind:

  • ExpressJS: ExpressJS ist ein NodeJS-Framework das einen robusten Satz von Funktionen für Web- und mobile Anwendungen bietet. Es vereinfacht den Prozess der Erstellung von Backend-Anwendungen mit NodeJS.
  • Express-Ratenbegrenzung: Express Rate Limit ist eine ratenbegrenzende Middleware für ExpressJS. Es begrenzt wiederholte Anfragen an öffentliche APIs und/oder Endpunkte, wie z. B. Zurücksetzen von Passwörtern, Benutzeranmeldungen usw.

Installieren Sie die erforderlichen Abhängigkeiten, indem Sie Folgendes ausführen:

npm Installieren Express Express-Tarif-Grenze

Schritt 2: Erstellen einer Express-Anwendung

Sie müssen einen einfachen Express-Server erstellen, der auf Anfragen lauscht, die an Ihre Anwendung gesendet werden.

Erstellen Sie zunächst eine index.js Datei im Stammverzeichnis Ihres Projekts. Dies ist die Eingabedatei für Ihre Anwendung.

Fügen Sie als Nächstes den folgenden Code zu Ihrer hinzu index.js Datei:

// index.js
konst ausdrücken = benötigen("ausdrücken");
konst app = ausdrücken ();
konst port = process.env. HAFEN || 3000

app.listen (Port, () => {
Konsole.Protokoll(`App läuft auf Port ${port}`);
});

Dieser Code wird importiert ausdrücken und erstellt eine Express-Anwendung durch Aufrufen von express() und Speichern des Rückgabewerts in der App Variable. Es lauscht dann auf Verkehr am Port 3000 durch Anruf beim Hören Methode auf der App Objekt.

Schritt 3: Routen-Handler erstellen

Erstellen Sie als Nächstes einige Routenhandler, auf denen Sie die Ratenbegrenzungslösung implementieren können.

Erstellen Sie zunächst einen Ordner „routes“ im Stammverzeichnis Ihres Projekts, indem Sie Folgendes ausführen:

mkdir-Routen

Erstellen Sie eine Datei, routen.js, in Ihrem Routenordner und fügen Sie den folgenden Code hinzu:

konst ausdrücken = benötigen("ausdrücken");
konst Router = Express. Router();

router.get("/", (req, res) => {
res.send({ Nachricht: "Hallo, dies ist eine GET-Anfrage" });
});

router.post("/add-demo", (req, res) => {
res.status (201).send({ Nachricht: "Ressource erfolgreich erstellt" });
});

router.put("/update-demo", (req, res) => {
res.status (201).send({ Nachricht: "Ressource erfolgreich aktualisiert" });
});

Modul.Exporte = Router;

Dieser Code wird importiert ausdrücken, ruft die Router Methode an ausdrücken, und speichert den Wert in einer Variablen, Router. Das Router -Methode können Sie modulare, einhängbare Routenhandler erstellen. Sie können Routenhandler für a erstellen ERHALTEN Anfrage zu "/", a POST Anfrage zu "/add-demo", und ein STELLEN Anfrage zu "/update-demo”. Exportieren Sie abschließend die Router Variable.

Als nächstes importieren Sie die Router Variable in Ihrem index.js Datei:

// index.js
konst Strecken = benötigen("./routen/routen");

Verwenden Sie es dann als Middleware in Ihrer index.js-Datei:

// index.js
App.verwenden(Strecken);

Achten Sie darauf, den obigen Codeblock vor dem zu platzieren app.listen Anruf.

Schritt 4: Ratenbegrenzung implementieren

Erstellen Sie zunächst ein „Middleware“-Ordner im Stammverzeichnis Ihres Projekts, indem Sie Folgendes ausführen:

mkdir-Middleware

Erstellen Sie dann eine Datei mit dem Namen „rate-limiter.js“ im Middleware-Verzeichnis. Fügen Sie dieser Datei den folgenden Code hinzu:

// rate-limiter.js
konst rateLimiter = benötigen("Express-Rate-Limit");

konst limiter = rateLimiter({
maximal: 5,
windowMS: 10000, // 10 Sekunden
Botschaft: "Du kannst'Im Moment keine Anfragen mehr stellen. Versuchen Sie es später noch einmal",
});

Modul.Exporte = Begrenzer

Das rateLimiter Die Funktion nimmt ein Konfigurationsobjekt mit den Bedingungen, um die Anzahl der Anfragen zu begrenzen.

Die Eigenschaften im obigen Konfigurationsobjekt sind:

  • max: Diese Eigenschaft muss immer a sein Nummer oder eine Funktion, die eine Zahl zurückgibt. Es stellt die maximale Anzahl von Anfragen dar, die ein Benutzer innerhalb eines bestimmten Zeitrahmens stellen kann. Wenn diese Eigenschaft nicht im Konfigurationsobjekt festgelegt ist, ist sie standardmäßig auf 5.
  • windowsMS: Diese Eigenschaft sollte immer eine Zahl sein. Es stellt den Zeitraum dar, in dem mehrere Anfragen zugelassen werden Millisekunden. Wenn diese Eigenschaft nicht im Konfigurationsobjekt festgelegt ist, beträgt sie standardmäßig 60000 Millisekunden (eine Minute).
  • Botschaft: Diese Eigenschaft kann a Schnur, ein JSON-Objekt oder ein anderer Wert, der von unterstützt wird Antwort von Express.send Methode. Wenn diese Eigenschaft nicht im Konfigurationsobjekt festgelegt ist, ist sie standardmäßig auf „Zu viele Anfragen. Bitte versuchen Sie es später noch einmal.“

Die Funktion prüft dann auf wiederholte Anfragen an Ihre Anwendung. Wenn ein Benutzer das Limit überschreitet (max, 5) innerhalb des Zeitrahmens (FensterMS, 10s), wird die Anfrage blockiert. Es wird auch einen „Too Many Requests“-Fehler mit einem Statuscode von auslösen 429.

Importieren Sie abschließend die Limiter-Funktion in Ihre index.js -Datei und wenden Sie sie als globale Middleware in Ihrer Anwendung an. Tun Sie dies, indem Sie platzieren app.use (Begrenzer) über der Routen-Middleware. Dadurch wird die Ratenbegrenzungslösung auf alle Routen Ihrer Anwendung angewendet.

App.verwenden(Begrenzer);

Ratenbegrenzung bestimmter Routen

Sie können die Ratenbegrenzung auch auf bestimmte Strecken anwenden. Sie können sie separat konfigurieren, um Anfragen abzulehnen, die in einem anderen Zeitrahmen gestellt wurden, eine andere Nachricht anzuzeigen usw.

Angenommen, Sie implementieren eine Benutzeranmelderoute in Ihrer Anwendung. Möglicherweise müssen Sie eine ratenbegrenzende Konfiguration für die Anmelderoute hinzufügen, die sich von der Konfiguration unterscheidet, die von den anderen Routen verwendet wird.

Zuerst müssen Sie entfernen Begrenzer als Middleware auf Anwendungsebene verwenden und anwenden, da es in ExpressJS kein integriertes Middleware-Filtersystem gibt. Selbst wenn Sie also einer Route eine spezifische Ratenbegrenzungslösung hinzufügen, würde die globale Middleware weiterhin auf dieser Route ausgeführt.

Erstellen Sie als Nächstes eine neue Ratenbegrenzungskonfiguration in Ihrem rate-limiter.js Datei und exportiere sie.

konst signInLimiter = rateLimiter({
maximal: 3,
windowMS: 10000, //10 Sekunden
Botschaft: "Zu viele Anmeldeversuche. Versuchen Sie es später noch einmal."
})

Modul.Exporte = {
Begrenzer,
signInLimiter
}

Das signInLimiter Konfigurationsobjekt hat eine andere Anzahl von max Anfragen und eine andere Fehlermeldung als der allgemeine Ratenbegrenzer.

Aktualisieren Sie schließlich Ihre router.js Datei mit dem folgenden Codeblock:

//router.js
konst ausdrücken = benötigen("ausdrücken");
konst Router = Express. Router();
konst {Begrenzer, signInLimiter} = benötigen("../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ Nachricht: "Hallo, dies ist eine GET-Anfrage" });
});

Router.verwenden(Begrenzer)

router.post("/post", (req, res) => {
res.status (201).send({ Nachricht: "Ressource erfolgreich erstellt" });
});

router.put("/put", (req, res) => {
res.status (201).send({ Nachricht: "Ressource erfolgreich aktualisiert" });
});

Modul.Exporte = Router;

Im obigen Codeblock haben Sie importiert Begrenzer und signInLimiter. Dann hast du dich beworben signInLimiter als spezifischer Ratenbegrenzer für die „/sign-in" Route.

Schließlich durch das Platzieren router.use (Begrenzer) Über den restlichen Routen haben Sie den Limiter als Ratenbegrenzer für die restlichen Routen angewendet.

Die Bedeutung der Ratenbegrenzung

Die Ratenbegrenzung reduziert die Belastung Ihres Webservers, indem vermieden wird, dass zu viele Anfragen gleichzeitig verarbeitet werden müssen. Es verringert die Bot-Aktivität, schützt Sie vor Denial-of-Service-Angriffen (DoS) und verhindert Brute-Force-Angriffe.