‫Instructeur : Dans cette conférence, implémentons la limitation du débit
‫afin d'empêcher la même adresse IP
‫de faire trop de demandes à notre API et cela
‫nous aidera ensuite à prévenir les attaques telles
‫que le déni de service ou les attaques par force brute.
‫Ainsi, ce limiteur de débit sera implémenté
‫en tant que fonction middleware globale.
‫Donc, en gros, ce que le limiteur de débit va
‫faire, c'est de compter le nombre de requêtes provenant d'une IP, puis,
‫quand il y a trop
‫de requêtes, de bloquer ces requêtes, d'accord ?
‫Et il est donc logique d'implémenter cela dans un
‫middleware global, donc, nous le faisons dans l'application. js.
‫Donc, nous n'avons pas utilisé celui-ci depuis longtemps, et
‫le limiteur de débit que
‫nous allons utiliser est un package npm appelé Express Rate Limit.
‫Alors installons ça.
‫npm i express-rate-limit, d'accord.
‫Et puis, ici en haut de notre
‫application, appelons-le rateLimit, puis demandons l'express et en fait,
‫il est déjà là. Donc, le code VS récupère ce
‫nom dans notre package. fichier json.
‫D'accord, et ce nom que je
‫lui ai donné ici vient généralement de la documentation.
‫Donc s'ils le font comme ça dans
‫la documentation, eh bien, c'est aussi la voie que je suis.
‫D'accord, alors utilisons maintenant ce
‫middleware ici au sommet de nos middlewares mondiaux,
‫écrivons-le ici, global.
‫Et on commence par créer un limiteur.
‫Donc limiteur, et nous le faisons en
‫appelant la fonction rateLimit que nous venons de définir là-haut.
‫Donc rateLimit est une fonction
‫qui reçoit un objet d'options, d'accord ?
‫Et ici, nous pouvons essentiellement
‫définir le nombre de requêtes par IP que nous allons
‫autoriser dans un certain laps de temps.
‫Nous pouvons donc spécifier la propriété max, que
‫je vais définir sur 100, puis également la fenêtre, donc
‫la fenêtre de temps, d'accord ?
‫Donc, ce que je veux autoriser ici,
‫c'est essentiellement 100 requêtes par heure.
‫Et cela s'appelle en fait des millisecondes de fenêtre.
‫D'accord, et donc nous voulons une heure donc 60
‫minutes, fois 60 pour les secondes, fois 1 000 pour les millisecondes.
‫D'accord, encore une fois, cela permettra
‫d'autoriser 100 requêtes de la même adresse IP en une heure.
‫D'accord, et si cette limite est
‫ensuite franchie par une certaine IP, ils recevront un message d'erreur.
‫Et ici, nous pouvons maintenant spécifier ce message.
‫Trop de demandes de cette adresse IP, veuillez réessayer
‫dans une heure, d'accord, nous devons donc en quelque sorte trouver
‫un équilibre qui fonctionne
‫le mieux pour notre application.
‫Par exemple, si vous construisez une
‫API, qui a vraiment besoin de beaucoup de demandes pour une adresse IP,
‫alors bien sûr, ce nombre ici devrait être plus grand.
‫Alors ne suivez pas aveuglément ce que je viens de mettre
‫ici, mais adaptez-le vraiment à votre propre application pour
‫ne pas le rendre inutilisable
‫à cause de ce limiteur, d'accord ?
‫Quoi qu'il en soit, ce limiteur que nous venons de
‫créer est fondamentalement une fonction middleware, d'accord ?
‫Ainsi, rateLimit est une fonction qui, en fonction
‫de nos objets, créera une fonction middleware, que nous pouvons
‫désormais utiliser à l'aide de app. utiliser comme nous le faisions avant.
‫Et nous pouvons le faire simplement comme ça.
‫Mais ce que nous voulons en
‫fait, c'est limiter l'accès à notre route API.
‫Donc, nous pouvons spécifier cela ici,
‫rappelez-vous que nous pouvons le faire avec un middleware.
‫Et donc, nous voulons essentiellement appliquer ce limiteur uniquement
‫à une API slash, d'accord ?
‫Et donc cela affectera ensuite
‫toutes les routes qui commencent essentiellement par cela, votre
‫application, donc l'API de barre oblique, super.
‫Revenons donc à notre onglet principal ici.
‫Sauvegardez-le, et maintenant essayons cela et faisons-le ici avec le
‫plus simple, alors obtenez
‫toutes les visites, puis voici notre résultat et maintenant ce que
‫je veux vous montrer, ce sont ces en-têtes ici.
‫Donc, notre limiteur de débit crée
‫ces deux en-têtes donc le RateLimit-Limit et le RateLimit-Remaining, d'accord ?
‫Nous commençons donc avec 100 comme nous l'avons défini,
‫et maintenant il nous en reste
‫99, car nous avons déjà fait une demande, n'est-ce pas ?
‫Alors, que se passe-t-il si nous en faisons un autre ?
‫Faisons-le avec Get Tour, par exemple, et il n'y
‫a pas de tournée avec
‫cet identifiant, mais cela n'a pas d'importance,
‫ce qui compte ici, c'est que le reste est maintenant à 98.
‫Et si nous l'essayons à nouveau,
‫alors vous verrez que c'est encore plus bas jusqu'à 97, d'accord ?
‫Et en fait, ici, nous avons aussi la réinitialisation.
‫Donc, fondamentalement, l'horodatage où il est réinitialisé, d'accord ?
‫Donc cette fenêtre d'une heure que nous avons spécifiée auparavant.
‫Bon, maintenant, si entre-temps, notre application est redémarrée, donc pour
‫ce faire, je vais simplement sauvegarder.
‫Voyons ce qui se passe alors, d'accord, donc je
‫l'envoie à nouveau, et donc
‫maintenant nous repartons du début en gros.
‫D'accord, notre application ne peut donc pas planter pendant
‫ce temps car sinon,
‫cela réinitialisera également la limite, d'accord ?
‫Maintenant, essayons en fait de voir le message d'erreur,
‫et je vais donc réduire ce maximum à trois, d'accord ?
‫Et enregistrez-le ici, envoyez cette demande, et dans nos en-têtes, nous
‫voyons maintenant
‫qu'il n'en reste que deux, essayons-en un autre et
‫maintenant il ne reste plus rien, donc c'était probablement
‫notre dernier, voyons le corps, alors cette
‫fois, nous toujours des données,
‫mais si nous réessayons maintenant, nous avons une erreur.
‫Roo de nombreuses demandes de cette IP.
‫Et puis, il définira
‫automatiquement le code d'état sur 429, ce qui signifie trop de demandes.
‫D'accord, et encore une fois, cela nous aidera à essayer
‫d'empêcher le déni de service et les attaques par force brute où
‫un attaquant essaie de deviner le
‫mot de passe d'un utilisateur, essentiellement en
‫utilisant, comme son nom l'indique, la force brute.
‫D'accord, c'est donc une limitation de l'API,
‫assez simple à mettre en œuvre avec
‫ce package Express Rate Limit.