Ugrás a tartalomra
Rapcsány Krisztián Rapcsány Krisztián
← Összes cikk
2 perc olvasás

Egy Laravel buktató: a throttle számláló közös

Laravel Hibakeresés Biztonság

Az oldalamhoz írtam egy apró, sütimentes mérést: minden oldalbetöltésnél és gombkattintásnál egy kérés megy a szerverre. Az űrlapra percenként öt beküldést engedek. Tesztelés közben a beküldés 429-es hibát adott, pedig alig próbálkoztam.

Mi történt

A Laravelben a throttle:5,1 típusú szabály a kérés azonosítóját az IP-címből képezi, az útvonaltól függetlenül. Ha két útvonalra más-más limitet írok, a számláló mégis közös marad. A mérés kérései így elfogyasztották az űrlap öt beküldését.

A megoldás: névvel ellátott korlátozók

Minden korlátozónak saját kulcsot adok, és a szabályra névvel hivatkozom. Így a két útvonal számlálója külön él.

AppServiceProvider.php
// The plain "throttle:N,M" form shares ONE counter per IP, whatever the route.
// Named limiters with their own keys keep the counters apart.
RateLimiter::for('contact', fn (Request $request) => Limit::perMinute(5)->by('contact|'.$request->ip()));
RateLimiter::for('events', fn (Request $request) => Limit::perMinute(120)->by('events|'.$request->ip()));

// routes/web.php
Route::post('/e', [EventController::class, 'store'])->middleware('throttle:events');
Route::post('/contact', [ContactController::class, 'send'])->middleware('throttle:contact');

Kivonat valódi kódból, anonimizálva.

Hogyan veszem észre legközelebb

Írtam egy tesztet, ami nyolc mérési kérés után beküld egy űrlapot, és sikert vár. Ha valaki visszaállítja az egyszerű formát, a teszt elbukik. Az ilyen hibát nem a kódot olvasva szokás észrevenni, hanem akkor, amikor valaki csak azt látja, hogy a beküldés nem megy.

Hasonló problémán dolgozol?

Ha elakadtál, vagy átnéztetnéd a megoldásodat, írj, szívesen megnézem.

Írok neked →
Ajánlatot kérek →