cc-fiae-2024 / eventguru-app

Project to showcase our understanding of coding
https://eventguru.fun
0 stars 0 forks source link

Auth hardening #45

Open Ryuno-Ki opened 2 weeks ago

Ryuno-Ki commented 2 weeks ago

@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.

stevenobird commented 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

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.