Ένα API ή μια σελίδα login που δέχεται απεριόριστα αιτήματα είναι εύκολος στόχος: ένα script μπορεί να τη γεμίσει κίνηση ή να δοκιμάζει χιλιάδες κωδικούς. Το rate limiter middleware είναι ο «θυρωρός» που το εμποδίζει.
Τι είναι το middleware
Middleware είναι ένα κομμάτι κώδικα που βρίσκεται ανάμεσα στο αίτημα και στη λογική της εφαρμογής. Κάθε αίτημα περνά πρώτα από εκεί και μπορεί να περάσει παρακάτω ή να σταματήσει. Το rate limiter είναι ένα τέτοιο κομμάτι.
Πώς λειτουργεί
Για κάθε «κλειδί» (συνήθως IP, χρήστης ή API key) κρατάει έναν μετρητή για ένα χρονικό παράθυρο. Αν ο μετρητής ξεπεράσει το όριο, ο server απαντά με κωδικό 429 Too Many Requests και συχνά με την κεφαλίδα Retry-After, που λέει πότε μπορεί να ξαναδοκιμάσει ο πελάτης.
Οι συνηθισμένοι αλγόριθμοι είναι το fixed window (π.χ. 60 αιτήματα ανά λεπτό), το sliding window και το token bucket, που επιτρέπει σύντομες ριπές αλλά κρατά τον μέσο ρυθμό χαμηλά.
Ένα απλό παράδειγμα
function rateLimit(string $key, int $max, int $seconds): bool { $file = sys_get_temp_dir() . '/rl_' . md5($key); $hits = is_file($file) ? json_decode(file_get_contents($file), true) : []; $hits = array_filter($hits, fn($t) => $t > time() - $seconds); if (count($hits) >= $max) { return false; // 429 } $hits[] = time(); file_put_contents($file, json_encode($hits)); return true; }
Σε πραγματικά συστήματα ο μετρητής μένει σε κοινή μνήμη, όπως Redis, ώστε να ισχύει σε όλους τους servers.
Γιατί μετράει
- Προστατεύει από brute force σε login και από κατάχρηση του API.
- Κρατά τον server διαθέσιμο όταν ένας πελάτης στέλνει υπερβολικά πολλά αιτήματα.
- Μοιράζει δίκαια τους πόρους ανάμεσα στους χρήστες.
Τι να προσέχεις
Αν ο server είναι πίσω από proxy, το IP που βλέπεις μπορεί να είναι του proxy και όχι του πελάτη: όλοι οι χρήστες θα μετρούν μαζί. Επίσης το όριο πρέπει να είναι αρκετά ψηλό για τους κανονικούς χρήστες.
Πηγές
Εικόνα: Vector version by dnet based on image by User:ChaTo · CC BY-SA 3.0 · Wikimedia Commons
Τελευταία ενημέρωση:



