我正在试图弄清楚如何在我的网站上进行蛮力攻击。基于我所做的所有研究,最重要的答案是账户锁定&验证码。
如果我锁定用户,那么我将拒绝他们服务x个时间。这意味着如果攻击者攻击10个不同的帐户,他将锁定所有帐户。然后,当时间到了,他将再次锁定它们。基本上他可以坚持下去并让用户无限期地被锁定。用户可以联系我,但现在我需要处理10张门票,如果可能,我宁愿避免这项工作。所以我没有完全理解的是,这有什么用呢?攻击者可能没有考虑到这一点,但这会让我和用户感到非常悲痛。
我该怎么做? Ip禁止似乎毫无意义,因为它可以很容易地改变。
答案 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);
}
有更多详情
答案 1 :(得分:2)
不要显示用于公开登录的用户ID。有一个单独的显示ID。例如,他们可能会使用他们的电子邮件地址登录并选择要显示的其他名称。如果攻击者没有用户ID,则他无法重复登录尝试并锁定其他用户。
答案 2 :(得分:0)
您可以使用PoliteCaptcha,只有在禁用JavaScript时(如在大多数自动脚本中)或第一次提交尝试失败时才会显示验证码。这使得验证码对大多数普通用户都不可见,但对于垃圾邮件发送者来说却是隐藏的。