Ο περιορισμός ρυθμού είναι μια στρατηγική που μπορείτε να χρησιμοποιήσετε για να ελέγξετε την κυκλοφορία σε ένα δίκτυο. Περιορίζει τον αριθμό των αιτημάτων που μπορεί να κάνει ένας χρήστης μέσα σε ένα συγκεκριμένο χρονικό πλαίσιο.

Υπάρχουν διάφοροι αλγόριθμοι περιορισμού ρυθμού, ο καθένας με τους δικούς του συμβιβασμούς. Μια απλή και δημοφιλής μέθοδος είναι η παρακολούθηση των διευθύνσεων IP των αιτημάτων και ο έλεγχος του χρόνου που μεσολαβεί μεταξύ των αιτημάτων. Το σύστημα μπορεί στη συνέχεια να απορρίψει ένα αίτημα εάν η διεύθυνση IP του υπερβαίνει τον αριθμό των αιτημάτων που επιτρέπει το όριο.

Αυτή η προσέγγιση για τον περιορισμό των τιμών είναι εύκολο να κατασκευαστεί σε μια εφαρμογή NodeJS-Express, με λίγα μόνο βήματα.

Βήμα 1: Δημιουργία Αναπτυξιακού Περιβάλλοντος

Αρχικά, θα χρειαστεί να δημιουργήσετε και να αρχικοποιήσετε μια εφαρμογή Express.

Ξεκινήστε δημιουργώντας έναν κατάλογο έργου εκτελώντας:

mkdir express-app

Στη συνέχεια, εισαγάγετε αυτόν τον κατάλογο εκτελώντας:

CD express-app
instagram viewer

Στη συνέχεια, αρχικοποίηση npm, ο διαχειριστής πακέτων κόμβου, και δημιουργήστε ένα πακέτο.json αρχείο στην αίτησή σας εκτελώντας:

npm init -y

ο η σημαία θα δημιουργήσει το δικό σας πακέτο.json αρχείο με όλες τις προεπιλεγμένες ρυθμίσεις.

Στη συνέχεια, θα χρειαστεί να εγκαταστήσετε ορισμένες εξαρτήσεις. Οι εξαρτήσεις που απαιτούνται για αυτό το σεμινάριο είναι:

  • ExpressJS: Το ExpressJS είναι ένα πλαίσιο NodeJS που παρέχει ένα ισχυρό σύνολο δυνατοτήτων για εφαρμογές ιστού και κινητών. Απλοποιεί τη διαδικασία δημιουργίας εφαρμογών υποστήριξης με το NodeJS.
  • Όριο Express Rate: Το Express rate limit είναι ένα ενδιάμεσο λογισμικό που περιορίζει το ρυθμό για το ExpressJS. Περιορίζει τα επαναλαμβανόμενα αιτήματα σε δημόσια API ή/και τελικά σημεία, όπως επαναφορά κωδικού πρόσβασης, συνδέσεις χρηστών κ.λπ.

Εγκαταστήστε τις απαιτούμενες εξαρτήσεις εκτελώντας:

npm εγκαθιστώ Express rate-όριο

Βήμα 2: Δημιουργία μιας εφαρμογής Express

Θα χρειαστεί να δημιουργήσετε έναν βασικό διακομιστή Express που ακούει τα αιτήματα που υποβάλλονται στην εφαρμογή σας.

Πρώτα, δημιουργήστε ένα index.js αρχείο στον ριζικό κατάλογο του έργου σας. Αυτό θα είναι το αρχείο εισόδου για την αίτησή σας.

Στη συνέχεια, προσθέστε τον παρακάτω κώδικα στο δικό σας index.js αρχείο:

// index.js
συνθ εκφράζω = απαιτώ("εξπρές");
συνθ app = express();
συνθ port = διεργασία.env. ΛΙΜΑΝΙ || 3000

app.listen (port, () => {
κονσόλα.κούτσουρο(`Η εφαρμογή που εκτελείται στη θύρα ${port}`);
});

Αυτός ο κωδικός εισάγεται εξπρές και δημιουργεί μια εφαρμογή Express καλώντας την express() και αποθηκεύοντας την τιμή επιστροφής της στο εφαρμογή μεταβλητός. Στη συνέχεια ακούει την κίνηση στο λιμάνι 3000 καλώντας το ακούω μέθοδος στο εφαρμογή αντικείμενο.

Βήμα 3: Δημιουργία Route Handler

Στη συνέχεια, δημιουργήστε μερικούς χειριστές διαδρομής στους οποίους μπορείτε να εφαρμόσετε τη λύση περιορισμού ρυθμού.

Πρώτα, δημιουργήστε έναν φάκελο, διαδρομές, στον ριζικό κατάλογο του έργου σας εκτελώντας:

Διαδρομές mkdir

Δημιουργήστε ένα αρχείο, διαδρομές.js, μέσα στο φάκελο των διαδρομών σας και προσθέστε τον ακόλουθο κώδικα:

συνθ εκφράζω = απαιτώ("εξπρές");
συνθ δρομολογητής = εξπρές. Router();

router.get("/", (απ., res) => {
res.send({ μήνυμα: "Γεια σας, αυτό είναι ένα αίτημα GET" });
});

router.post("/add-demo", (απ., res) => {
res.status (201).send({ message: "Ο πόρος δημιουργήθηκε με επιτυχία" });
});

router.put("/update-demo", (απ., res) => {
res.status (201).send({ message: "Ο πόρος ενημερώθηκε με επιτυχία" });
});

μονάδα μέτρησης.εξαγωγές = δρομολογητής;

Αυτός ο κωδικός εισάγεται εξπρές, καλεί το Δρομολογητής μέθοδος για εξπρέςκαι αποθηκεύει την τιμή σε μια μεταβλητή, δρομολογητή. ο Δρομολογητής Η μέθοδος σάς επιτρέπει να δημιουργείτε αρθρωτούς, προσαρμόσιμους χειριστές διαδρομών. Μπορείτε να δημιουργήσετε προγράμματα χειρισμού διαδρομών για α ΠΑΙΡΝΩ αίτημα σε «/", ένα ΘΕΣΗ αίτημα σε «/add-demo", και ένα ΒΑΖΩ αίτημα σε «/update-demo”. Τέλος, εξάγετε το δρομολογητή μεταβλητός.

Στη συνέχεια, εισαγάγετε το δρομολογητή μεταβλητή σε σας index.js αρχείο:

// index.js
συνθ διαδρομές = απαιτώ("./routes/routes");

Στη συνέχεια, χρησιμοποιήστε το ως ενδιάμεσο λογισμικό στο αρχείο index.js:

// index.js
εφαρμογή.χρήση(διαδρομές);

Βεβαιωθείτε ότι έχετε τοποθετήσει το μπλοκ κώδικα παραπάνω πριν από το app.ακούστε κλήση.

Βήμα 4: Εφαρμογή περιορισμού ποσοστού

Πρώτα, δημιουργήστε ένα "ενδιάμεσο λογισμικό» στον ριζικό κατάλογο του έργου σας εκτελώντας:

mkdir ενδιάμεσο λογισμικό

Στη συνέχεια δημιουργήστε ένα αρχείο που ονομάζεται "rate-limiter.js” μέσα στον κατάλογο του ενδιάμεσου λογισμικού. Προσθέστε τον ακόλουθο κώδικα σε αυτό το αρχείο:

// rate-limiter.js
συνθ rateLimiter = απαιτώ("express-rate-limit");

συνθ περιοριστής = rateLimiter({
μέγιστο: 5,
windowMS: 10000, // 10 δευτερόλεπτα
μήνυμα: "Μπορείς'μην κάνετε άλλα αιτήματα αυτή τη στιγμή. Προσπαθήστε ξανά αργότερα",
});

μονάδα μέτρησης.εξαγωγές = περιοριστής

ο rateLimiter συνάρτηση παίρνει ένα αντικείμενο διαμόρφωσης με τις συνθήκες για τον περιορισμό του αριθμού των αιτημάτων.

Οι ιδιότητες στο παραπάνω αντικείμενο διαμόρφωσης είναι:

  • Μέγιστη: Αυτή η ιδιότητα πρέπει πάντα να είναι α αριθμός ή μια συνάρτηση που επιστρέφει έναν αριθμό. Αντιπροσωπεύει τον μέγιστο αριθμό αιτημάτων που μπορεί να υποβάλει ένας χρήστης εντός ενός καθορισμένου χρονικού πλαισίου. Εάν αυτή η ιδιότητα δεν έχει οριστεί στο αντικείμενο διαμόρφωσης, ορίζεται από προεπιλογή 5.
  • windowsMS: Αυτή η ιδιότητα πρέπει πάντα να είναι αριθμός. Αντιπροσωπεύει το χρονικό πλαίσιο στο οποίο επιτρέπονται πολλά αιτήματα χιλιοστά του δευτερολέπτου. Εάν αυτή η ιδιότητα δεν έχει οριστεί στο αντικείμενο διαμόρφωσης, ορίζεται από προεπιλογή στα 60000 χιλιοστά του δευτερολέπτου (ένα λεπτό).
  • μήνυμα: Αυτή η ιδιότητα μπορεί να είναι α σειρά, ένα αντικείμενο JSON ή οποιαδήποτε άλλη τιμή που υποστηρίζεται από Η απάντηση της Express.αποστολή μέθοδος. Εάν αυτή η ιδιότητα δεν έχει οριστεί στο αντικείμενο ρύθμισης παραμέτρων, ορίζεται από προεπιλογή σε "Υπερβολικά πολλά αιτήματα. Παρακαλώ προσπαθήστε ξανά αργότερα."

Στη συνέχεια, η λειτουργία θα ελέγξει για επαναλαμβανόμενα αιτήματα στην εφαρμογή σας. Εάν ένας χρήστης υπερβεί το όριο (Μέγιστη, 5) εντός του χρονικού πλαισίου (windowMS, 10s), θα μπλοκάρει το αίτημα. Θα εμφανίσει επίσης ένα σφάλμα "Πάρα πολλά αιτήματα" με κωδικό κατάστασης 429.

Τέλος, εισαγάγετε τη λειτουργία περιοριστή στο δικό σας index.js και εφαρμόστε το ως παγκόσμιο ενδιάμεσο λογισμικό στην εφαρμογή σας. Κάντε αυτό τοποθετώντας app.use (περιοριστής) πάνω από τις διαδρομές ενδιάμεσο λογισμικό. Αυτό εφαρμόζει τη λύση περιορισμού ρυθμού σε όλες τις διαδρομές της εφαρμογής σας.

εφαρμογή.χρήση(περιοριστής);

Συγκεκριμένες διαδρομές με περιορισμό τιμών

Μπορείτε επίσης να εφαρμόσετε περιορισμό τιμών σε συγκεκριμένες διαδρομές. Μπορείτε να τα διαμορφώσετε ξεχωριστά ώστε να απορρίπτουν αιτήματα που γίνονται σε διαφορετικό χρονικό πλαίσιο, να εμφανίζουν διαφορετικό μήνυμα κ.λπ.

Για παράδειγμα, ας υποθέσουμε ότι εφαρμόζετε μια διαδρομή σύνδεσης χρήστη στην εφαρμογή σας. Ίσως χρειαστεί να προσθέσετε μια διαμόρφωση περιορισμού ρυθμού για τη διαδρομή σύνδεσης που διαφέρει από τη διαμόρφωση που χρησιμοποιείται από τις άλλες διαδρομές.

Πρώτα, θα πρέπει να αφαιρέσετε περιοριστής ως ενδιάμεσο λογισμικό σε επίπεδο εφαρμογής και εφαρμόστε το επειδή δεν υπάρχει ενσωματωμένο σύστημα φίλτρου ενδιάμεσου λογισμικού στο ExpressJS. Έτσι, ακόμα κι αν προσθέσετε μια συγκεκριμένη λύση περιορισμού ρυθμού σε μια διαδρομή, το παγκόσμιο ενδιάμεσο λογισμικό θα συνεχίσει να λειτουργεί σε αυτήν τη διαδρομή.

Στη συνέχεια, δημιουργήστε μια νέα διαμόρφωση περιορισμού ρυθμού στο δικό σας rate-limiter.js αρχείο και εξαγωγή του.

συνθ signInLimiter = rateLimiter({
μέγιστο: 3,
windowMS: 10000, //10 δευτερόλεπτα
μήνυμα: "Πάρα πολλές προσπάθειες σύνδεσης. Προσπαθήστε ξανά αργότερα."
})

μονάδα μέτρησης.εξαγωγές = {
περιοριστής,
signInLimiter
}

ο signInLimiter Το αντικείμενο διαμόρφωσης έχει διαφορετικό αριθμό Μέγιστη αιτήματα και ένα διαφορετικό μήνυμα σφάλματος από τον γενικό περιοριστή ρυθμού.

Τέλος, ενημερώστε το δικό σας router.js αρχείο με το μπλοκ κώδικα παρακάτω:

// router.js
συνθ εκφράζω = απαιτώ("εξπρές");
συνθ δρομολογητής = εξπρές. Router();
συνθ {limiter, signInLimiter} = απαιτώ("../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (απαιτ., res, επόμενο) => {
res.send({ μήνυμα: "Γεια σας, αυτό είναι ένα αίτημα GET" });
});

δρομολογητή.χρήση(περιοριστής)

router.post("/post", (απ., res) => {
res.status (201).send({ message: "Ο πόρος δημιουργήθηκε με επιτυχία" });
});

router.put("/put", (απ., res) => {
res.status (201).send({ message: "Ο πόρος ενημερώθηκε με επιτυχία" });
});

μονάδα μέτρησης.εξαγωγές = δρομολογητής;

Στο μπλοκ κώδικα παραπάνω, πραγματοποιήσατε εισαγωγή περιοριστής και signInLimiter. Μετά έκανες αίτηση signInLimiter ως ειδικός περιοριστής συντελεστών στο «/sign-in" Διαδρομή.

Τέλος, με την τοποθέτηση router.use (περιοριστής) πάνω από τις υπόλοιπες διαδρομές, εφαρμόσατε τον περιοριστή ως περιοριστή ρυθμού για τις υπόλοιπες διαδρομές.

Η σημασία του περιορισμού του ποσοστού

Ο περιορισμός ρυθμού μειώνει την πίεση στον διακομιστή ιστού σας αποφεύγοντας να χρειάζεται να επεξεργαστείτε πάρα πολλά αιτήματα ταυτόχρονα. Μειώνει τη δραστηριότητα του bot, σας προστατεύει από επιθέσεις άρνησης υπηρεσίας (DoS) και αποτρέπει επιθέσεις ωμής βίας.