防止对MVC的暴力攻击

时间:2016-06-06 21:06:22

标签: c# asp.net security asp.net-mvc-5 brute-force

我正在试图弄清楚如何在我的网站上进行蛮力攻击。基于我所做的所有研究,最重要的答案是账户锁定&验证码。

如果我锁定用户,那么我将拒绝他们服务x个时间。这意味着如果攻击者攻击10个不同的帐户,他将锁定所有帐户。然后,当时间到了,他将再次锁定它们。基本上他可以坚持下去并让用户无限期地被锁定。用户可以联系我,但现在我需要处理10张门票,如果可能,我宁愿避免这项工作。所以我没有完全理解的是,这有什么用呢?攻击者可能没有考虑到这一点,但这会让我和用户感到非常悲痛。

我该怎么做? Ip禁止似乎毫无意义,因为它可以很容易地改变。

3 个答案:

答案 0 :(得分:3)

您可以添加一次增量延迟,在每次登录尝试失败后加倍,在少数登录尝试后,延迟时间太长而无法使用强力(例如,在20次尝试后延迟为6天)。

[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);
}

this post

有更多详情

答案 1 :(得分:2)

不要显示用于公开登录的用户ID。有一个单独的显示ID。例如,他们可能会使用他们的电子邮件地址登录并选择要显示的其他名称。如果攻击者没有用户ID,则他无法重复登录尝试并锁定其他用户。

答案 2 :(得分:0)

您可以使用PoliteCaptcha,只有在禁用JavaScript时(如在大多数自动脚本中)或第一次提交尝试失败时才会显示验证码。这使得验证码对大多数普通用户都不可见,但对于垃圾邮件发送者来说却是隐藏的。