Open Ryuno-Ki opened 2 weeks ago
Login Throttle wird in der App hier im FortifyServiceProvider gehandhabt.
Hier siehst du auch, wie genau die Request-Versuche unterschieden werden: user_name|ip_addresse
- standardmäßig sind dies 5 Versuche pro Minute pro E-Mail Adresse von einer IP.
Das Ganze könnten wir also nach unseren Belieben anpassen - im $request
Objekt hat man neben den HTTP-Request Parametern meine ich auch Zugriff auf die Client Header und noch andere Infos.
Da könnte man sich also austoben, wie z.B. mit mehreren Limitern pro Route.
Eine E-Mail könnte man senden, indem man
Limit::
call einen Aufruf von responseCallback
anhängen. Dieser Callback wird dann immer ausgelöst, wenn für diesen expliziten Limiter das Limit überschritten wurde.Der globale Handler ist in der bootstrap/app.php
, hier kann man im withExceptions
call wie hier in der Doku angegeben per Type-hinting für einzelne oder gruppierte Exceptions jeweils Reports machen. Für die Reports gibt es die verschiedensten Handler in Monolog. Standardmäßig landen diese "Reports" im storage/logs
Ordner in der laravel.log
(siehe config/logging.php
), man kann sich aber auch mit etwas mehr Arbeit eigene Handler für bestimmte Channels bauen.
Der Code für den responseCallback
wird hier aufgerufen und hier zurückgegeben - also effektiv wird hier die Exception generiert. Allerdings müssten wir hier wie in der Doku angegeben noch eine Response zurückgeben:
RateLimiter::for('login', function (Request $request) {
$throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip());
// $headers enthält 'X-RateLimit-Limit' und 'X-RateLimit-Remaining'
// und je nach Client auch 'Retry-After' und 'X-RateLimit-Reset' Header
return Limit::perMinute(5)->by($throttleKey)->response(function (Request $request, array $headers) {
Mail::to('very-important-admin@eventguru.fun')->send(new RateLimitReport($request, $headers));
return response('Custom response...', 429, $request->headers);
};
});
Zu Rate Limiting allgemein findet man hier in der Doku noch einiges Wissenswertes.
@stevenobird Lauf Doku wird das Login nach einigen fehlgeschlagenen Versuchen erst einmal gebremst. Kennst du die genaue Anzahl? Wo wäre der Code dafür?
Die Überlegung ist es, den Betreibern eine E-Mail zu senden, weil es ein möglicher Angriff sein könnte.