防止蛮力攻击的最佳方法是什么?

lec*_*rdo 31 php brute-force

我有登录页面,当然我希望防止暴力攻击,并在用户登录时减少延迟.

目前,您输入用户名和密码登录.

我正在考虑实施一个reCAPTCHA.但是,这显示在3次尝试失败后登录.

我的问题是:

  1. 你的尝试基础是什么?IP地址?它总是可以隐藏...用户名?如果他们尝试的用户不存在怎么办?

  2. 计算失败登录尝试的最佳方法是什么?

Sam*_*tch 49

会话不可靠,因为他们依赖cookie,CAPTCHAs经常被破坏[包括ReCAPTCHA].唯一可靠的方法看似简单:问一个问题.不要使用数学问题,因为计算机出于某种原因出人意料地善于解决这些问题.伟大的老备用品是这样的:

  • 本页第六段中的第四个单词是什么?
  • 这个网站的作者姓名是什么?[暗示]

这是愚蠢的 - 易于实现,并且机器很难解决.

至于强制执行,请尝试在用户表中添加两个字段,'first_failed_login'[ INTEGERunix timestamp or DATETIME]和'failed_login_count'.[ INTEGER]

<?php
$bad_login_limit = 3;
$lockout_time = 600;

$first_failed_login, failed_login_count; // retrieve from DB

if(
    ($failed_login_count >= $bad_login_limit)
    &&
    (time() - $first_failed_login < $lockout_time)
) {
  echo "You are currently locked out.";
  exit; // or return, or whatever.
} else if( /* login is invalid */ ) {
  if( time() - $first_failed_login > $lockout_time ) {
    // first unsuccessful login since $lockout_time on the last one expired
    $first_failed_login = time(); // commit to DB
    $failed_login_count = 1; // commit to db
  } else {
    $failed_login_count++; // commit to db.
  }
  exit; // or return, or whatever.
} else {
  // user is not currently locked out, and the login is valid.
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这将使您的登录系统每10分钟仅识别每个用户3次登录尝试.

  • 很好的答案,但这只有在黑客正在尝试已经存在的用户并且在黑客试图暴力破坏他时也会锁定真正的用户时才有意义. (7认同)
  • @ user2721465 1.你究竟如何强行使用不存在的用户?2.如果没有密码,您如何区分真正的用户和冒牌者?可以允许真正的用户通过电子邮件或其他东西解锁他们的帐户,但这超出了问题的范围. (7认同)
  • @Sammitch这种机制将允许攻击者在尝试查找真正的用户帐户时重复登录,并且他将在何时找到一个,因为只有在尝试以真正的用户身份登录时才会发生暴力测量. (4认同)
  • @dlofrodloh和改革是对的.攻击者可以注意到真正的用户.但是,如果你使用缓存与这种保护方法相结合,这仍然是一个很好的答案.(https://coderwall.com/p/sauviq/brute-force-protection-in-php) (2认同)