‫Kursleiter: Lassen Sie uns in dieser Vorlesung
‫eine Ratenbegrenzung implementieren, um
‫zu verhindern, dass dieselbe IP zu viele Anfragen
‫an unsere API stellt, und dies wird
‫uns helfen, Angriffe wie Denial-of-Service- oder Brute-Force-Angriffe zu verhindern.
‫Dieser Ratenbegrenzer wird also als
‫globale Middleware-Funktion implementiert.
‫Im Grunde genommen wird der Ratenbegrenzer also die
‫Anzahl der Anfragen zählen, die von einer IP kommen, und
‫dann, wenn es zu
‫viele Anfragen gibt, diese Anfragen blockieren, okay?
‫Daher ist es sinnvoll, dies in einer globalen Middleware
‫zu implementieren, also tun wir das in App. js.
‫Wir haben diesen also schon lange nicht mehr verwendet,
‫und der Ratenbegrenzer, den
‫wir verwenden werden, ist ein npm-Paket namens Express Rate Limit.
‫Also installieren wir das.
‫npm i Express-Rate-Limit, in Ordnung.
‫Und dann, hier oben in unserer Anwendung,
‫nennen wir es rateLimit und fordern dann den Express an,
‫und tatsächlich ist er bereits da. VS-Code holt sich diesen
‫Namen aus unserem Paket. json-Datei.
‫Okay, und dieser Name, den ich
‫ihm hier gegeben habe, stammt normalerweise aus der Dokumentation.
‫Wenn sie es also in der
‫Dokumentation so machen, nun, dann folge ich auch diesem Weg.
‫Okay, also lassen Sie uns diese Middleware
‫jetzt direkt hier an der Spitze unserer globalen Middleware verwenden, schreiben
‫wir das tatsächlich hier, global.
‫Und wir beginnen mit der Erstellung eines Limiters.
‫Also limiter, und das tun wir, indem
‫wir die rateLimit-Funktion aufrufen, die wir gerade dort oben definiert haben.
‫rateLimit ist also eine
‫Funktion, die ein Optionsobjekt empfängt, okay?
‫Und hier können wir
‫im Grunde definieren, wie viele Anfragen pro IP
‫wir in einer bestimmten Zeit zulassen.
‫Wir können also die max-Eigenschaft angeben, die
‫ich auf 100 setze, und dann auch das
‫Fenster, also das Zeitfenster, okay?
‫Was ich hier also zulassen möchte, sind
‫im Grunde 100 Anfragen pro Stunde.
‫Und das nennt man hier eigentlich Fenster-Millisekunden.
‫Okay, und wir wollen eine Stunde also
‫60 Minuten, mal 60 für Sekunden, mal 1.000 für Millisekunden.
‫In Ordnung, auch hier werden
‫100 Anfragen von derselben IP in einer Stunde zugelassen.
‫Okay, und wenn diese Grenze dann
‫von einer bestimmten IP überschritten wird, erhalten sie eine Fehlermeldung zurück.
‫Und hier können wir nun diese Nachricht spezifizieren.
‫Zu viele Anfragen von dieser IP. Bitte versuchen Sie
‫es in einer Stunde noch einmal. Wir müssen also ein Gleichgewicht
‫finden, das für unsere
‫Anwendung am besten geeignet ist.
‫Wenn Sie beispielsweise eine API
‫erstellen, die wirklich viele Anfragen für eine IP benötigt, dann
‫sollte diese Zahl hier natürlich höher sein.
‫Folgen Sie also nicht einfach blindlings dem, was ich hier gerade
‫geschrieben habe, sondern passen Sie es wirklich an Ihre eigene
‫Anwendung an, damit Sie es
‫nicht durch diesen Begrenzer unbrauchbar machen, okay?
‫Wie auch immer, dieser Begrenzer hier, den wir gerade erstellt
‫haben, ist im Grunde eine Middleware-Funktion, okay?
‫rateLimit ist also eine Funktion, die basierend
‫auf unseren Objekten eine Middleware-Funktion erstellt, die wir jetzt
‫mit der App verwenden können. verwenden, wie wir es zuvor getan haben.
‫Und wir können es einfach so machen.
‫Aber was wir eigentlich wollen, ist,
‫den Zugriff auf unsere API-Route grundsätzlich einzuschränken.
‫Wir können das hier also spezifizieren,
‫denken Sie daran, dass wir dies mit Middleware tun können.
‫Wir wollen diesen Limiter also grundsätzlich nur
‫auf eine Slash-API anwenden, okay?
‫Und das wirkt sich dann
‫auf alle Routen aus, die im Grunde damit
‫beginnen, deine App also Slash API, super.
‫Kehren wir also hier zu unserem Haupt-Tab zurück.
‫Speichern Sie es, und jetzt versuchen wir es tatsächlich und machen
‫wir es hier mit dem
‫einfachsten, also holen Sie sich alle Touren, dann ist hier unser Ergebnis und
‫was ich Ihnen jetzt zeigen möchte, sind diese Header hier.
‫Unser Ratenbegrenzer erstellt also diese
‫beiden Header, also das RateLimit-Limit und das RateLimit-Remaining, okay?
‫Also fangen wir mit 100 an, wie wir
‫es definiert haben, und jetzt haben
‫wir 99 übrig, weil wir schon eine Anfrage gemacht haben, oder?
‫Was passiert also, wenn wir einen anderen machen?
‫Machen wir es zum Beispiel mit Get Tour, und
‫es gibt keine Tour mit
‫dieser ID, aber das spielt keine Rolle,
‫hier ist es wichtig, dass der Rest jetzt auf 98 reduziert ist.
‫Und wenn wir es noch einmal versuchen,
‫werden Sie sehen, dass es sogar noch weiter auf 97 gesunken ist, okay?
‫Und eigentlich haben wir hier unten auch den Reset.
‫Also im Grunde ist der Zeitstempel, wo er zurückgesetzt wird, in Ordnung?
‫Also das einstündige Fenster, das wir zuvor angegeben haben.
‫Okay, wenn jetzt zwischendurch unsere App neu gestartet wird,
‫so speichere ich dafür einfach ab.
‫Mal sehen, was dann passiert, okay, also schicke ich es
‫noch einmal, und jetzt fangen
‫wir im Grunde wieder von vorne an.
‫Okay, unsere App kann in dieser Zeit also nicht abstürzen,
‫da sonst das Limit
‫dann im Grunde auch zurückgesetzt wird, okay?
‫Jetzt versuchen wir tatsächlich, die Fehlermeldung zu sehen,
‫und deshalb werde ich dieses Maximum auf nur drei reduzieren, okay?
‫Und speichern Sie es hier, senden Sie diese
‫Anfrage, und
‫in unseren Headern sehen wir jetzt, dass
‫wir nur noch zwei übrig haben
‫immer noch Daten erhalten, aber
‫wenn wir es jetzt
‫noch einmal versuchen, erhalten wir einen Fehler.
‫Roo viele Anfragen von dieser IP.
‫Und dann wird der
‫Statuscode automatisch auf 429 gesetzt, was zu viele Anfragen bedeutet.
‫Okay, und das wird uns helfen, Denial-of-Service-
‫und Brute-Force-Angriffe zu verhindern, bei denen ein Angreifer versucht,
‫das Passwort eines Benutzers
‫zu erraten, im Wesentlichen mit
‫Brute-Force, wie der Name schon sagt.
‫Okay, das ist API-Beschränkung, die
‫mit diesem Express-Ratenlimit-Paket ganz einfach
‫zu implementieren ist.