2016-06-06 6 views
0

Ich versuche herauszufinden, wie man einen Brute-Force-Angriff auf meiner Website bekämpft. Basierend auf all den Recherchen, die ich gemacht habe, waren die Top-Antworten Account Lockout & Captcha.Verhindern brutaler Gewaltangriffe auf MVC

Wenn ich einen Benutzer aussperren, verweigere ich ihnen Service für x Zeit. Das heißt, wenn ein Angreifer 10 verschiedene Accounts angreift, sperrt er sie alle. Wenn die Zeit abgelaufen ist, sperrt er sie wieder. Im Grunde kann er es behalten und die Nutzer auf unbestimmte Zeit aussperren. Die Benutzer können mich kontaktieren, aber das sind jetzt 10 Tickets, mit denen ich mich befassen müsste, und ich würde diese Arbeit lieber vermeiden, wenn es möglich ist. Was ich also nicht genau verstehe, ist, wie ist das dann nützlich? Der Angreifer wird vielleicht nicht in Betracht gezogen, aber sie werden mir und den Benutzern viel Kummer bereiten.

Wie bekämpfe ich das? IP-Verbot scheint sinnlos, da es ziemlich einfach geändert werden kann.

+2

Offtopic. Keine Programmierfragen (noch). Versuchen Sie stattdessen die Webmaster-Site. –

+0

Dieser Link hat eine tolle Aufschrift zu verschiedenen Methoden, ich habe das Passwort eine Verzögerung vor mir selbst benutzt. https://www.owasp.org/index.php/Blocking_Brute_Force_Attacks – Slicksim

Antwort

1

Zeigen Sie nicht die Benutzer-ID an, die für die öffentliche Anmeldung verwendet wird. Habe eine separate Display-ID. Sie könnten sich beispielsweise mit ihrer E-Mail-Adresse anmelden und einen anderen Namen für die Anzeige auswählen. Wenn ein Angreifer nicht über die Benutzer-ID verfügt, kann er keine wiederholten Anmeldeversuche durchführen und einen anderen Benutzer sperren.

+0

Ich habe dies bereits implementiert. Aber selbst dann kann er Massen-E-Mails von einer anderen Website bekommen und einfach damit anfangen. Meine Fehlermeldungen sind auch so, nicht zu verraten, wenn der Account gesperrt ist oder irgendetwas, damit sie nicht wissen, ob sie es richtig verstanden haben, aber ich frage mich, ob es etwas gibt, was ich tun kann, um sie tatsächlich zu stoppen? – Bojan

+0

Einige CDN-Dienste wie Incapsula oder Akamai helfen. Ihr Hauptzweck ist als CDN, also alle Anfragen an Ihre Domain gehen durch ihre Server. Das ermöglicht andere Funktionen wie das Blockieren von Anfragen von bestimmten Domänen. Sie können sogar Domänen proaktiv blockieren, wenn sie verdächtige Aktivitäten erkennen. –

+0

Wie viel Overhead würde das zum Laden der Seite beitragen? Würde die Ladezeit stark beeinflusst werden? – Bojan

0

Sie könnten eine PoliteCaptcha verwenden, die nur das Captcha anzeigt, wenn JavaScript deaktiviert ist (wie in den meisten automatisierten Skripts) oder wenn der erste Sendeversuch fehlschlägt. Dies macht das Captcha für die meisten Ihrer normalen Benutzer unsichtbar, aber ein PITA für Spammer.

0

Sie können eine inkrementelle Verzögerung hinzufügen, die sich nach jedem fehlgeschlagenen Anmeldeversuch verdoppelt. Nach einer Handvoll Anmeldeversuche wird die Verzögerung für Brute Force zu lang (z. B. nach 20 Versuchen beträgt die Verzögerung 6 Tage).

[HttpPost] 
public async Task<ActionResult> Login(LoginViewModel viewModel, string returnUrl) 
{ 
    // incremental delay to prevent brute force attacks 
    int incrementalDelay; 
    if (HttpContext.Application[Request.UserHostAddress] != null) 
    { 
     // wait for delay if there is one 
     incrementalDelay = (int)HttpContext.Application[Request.UserHostAddress]; 
     await Task.Delay(incrementalDelay * 1000); 
    } 

    if (!ModelState.IsValid) 
     return View(); 

    // authenticate user 
    var user = _userService.Authenticate(viewModel.Username, viewModel.Password); 

    if (user == null) 
    { 
     // login failed 

     // increment the delay on failed login attempts 
     if (HttpContext.Application[Request.UserHostAddress] == null) 
     { 
      incrementalDelay = 1; 
     } 
     else 
     { 
      incrementalDelay = (int)HttpContext.Application[Request.UserHostAddress] * 2; 
     } 
     HttpContext.Application[Request.UserHostAddress] = incrementalDelay; 

     // return view with error 
     ModelState.AddModelError("", "The user name or password provided is incorrect."); 
     return View(); 
    } 

    // login success 

    // reset incremental delay on successful login 
    if (HttpContext.Application[Request.UserHostAddress] != null) 
    { 
     HttpContext.Application.Remove(Request.UserHostAddress); 
    } 

    // set authentication cookie 
    _formsAuthenticationService.SetAuthCookie(
     user.Username, 
     viewModel.KeepMeLoggedIn, 
     null); 

    // redirect to returnUrl 
    return Redirect(returnUrl); 
} 

Es gibt weitere Details zu this post

Verwandte Themen