Egy Laravel buktató: a throttle számláló közös
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.
// 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 →További cikkek
Botvédelem kapcsolati űrlapra captcha nélkül
Öt láthatatlan réteg, amitől a kéretlen üzenetek nagy része elakad, és a valódi látogatónak semmit nem kell csinálnia.
Elolvasom →Szigorú CSP Laravelben, Vite-tal
Hogyan engedem a saját beágyazott szkriptjeimet egyedi azonosítóval, és tiltok le minden mást.
Elolvasom →