Come funziona il facade RateLimiter
Il rate limiting di Laravel è formato dalla classe Illuminate\Cache\RateLimiting\Limit e dal facade RateLimiter. Internamente memorizza contatori nel driver di cache (di default file o Redis) e tiene traccia del numero di richieste.
Sulla richiesta ricevuta dal middleware throttle, viene eseguita la closure definita con RateLimiter::for(): se il limite è raggiunto, viene restituito 429 Too Many Requests.
Definire un limiter personalizzato in AppServiceProvider
Definisci le impostazioni di rate limit nel metodo boot() di App\Providers\AppServiceProvider.
RateLimiter::for() è il nome del limiter, usato quando lo referenzi dal middleware throttle. La closure passata come secondo argomento deve restituire un’istanza Illuminate\Cache\RateLimiting\Limit.
Rate limit per utente, IP e piano
Limiti diversi tra utenti autenticati e ospiti
Limiti in base al piano dell’utente
Limite globale per IP
Throttling per indirizzo IP, indipendentemente da endpoint specifici.Combinare più limiti
Restituendo un array, tutti i limiti vengono valutati. Basta che uno sia raggiunto per restituire429.
Quando definisci più limiti con lo stesso valore di
by, aggiungi un prefisso per evitare conflitti tra chiavi.Middleware throttle e specifica del nome del limiter
Al middleware throttle passi il nome del limiter definito.
Registrazione in bootstrap/app.php
Da Laravel 11, i middleware si gestiscono in bootstrap/app.php.
Esempio di applicazione alle rotte API
1
Definire i limiter
Definisci più limiter in
AppServiceProvider.2
Applicare il middleware alle rotte
Come funzionano gli header di risposta (X-RateLimit-*)
Il middleware throttle aggiunge automaticamente alle response gli header con le informazioni di limite.
Restituire una response personalizzata
Controllo manuale con RateLimiter::attempt()
Se vuoi verificare il rate limit in un punto specifico del codice, senza usare il middleware throttle, usa RateLimiter::attempt().
Verifica dei tentativi e reset
Esempio di throttling del login
Rate limit basato sulla risposta
Se vuoi contare solo determinate response, usaafter(). Esempio in cui conti solo le 404 per prevenire attacchi di enumerazione di risorse:
Rate limiting con Redis
Basta cambiare il driver di cache predefinito in Redis e anche il middlewarethrottle userà Redis automaticamente.
Configurazione del driver Redis
Usare throttleWithRedis
Per usare il throttling middleware ottimizzato per Redis, chiama throttleWithRedis() in bootstrap/app.php.
throttle viene mappato sulla classe ThrottleRequestsWithRedis e il conteggio avviene con precisione grazie alle operazioni atomiche di Redis.
Vantaggi di usare Redis
- Compatibile con la scalabilità orizzontale — puoi condividere il contatore tra più istanze del server
- Alta precisione — le operazioni atomiche prevengono race condition
- Gestione del TTL — l’expiration nativo di Redis rimuove automaticamente i contatori
Pagine correlate
Cache
Rivedi configurazione e uso dei driver di cache di Laravel, Redis incluso.