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

新手上路,请多包涵

我有我的登录页面,当然我想防止暴力攻击并减少用户登录时的延迟。

目前,您输入用户名和密码进行登录。

我正在考虑实施 reCAPTCHA 。但是,这会在 3 次尝试失败后显示在登录上。

我的问题是:

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

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

原文由 lecardo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 459
2 个回答

会话不可靠,因为它们依赖于 cookie,验证码经常被破坏 [包括 ReCAPTCHA]。唯一可靠的方法看似简单:提出问题。不要使用数学问题,因为计算机出于某种原因 出奇地 擅长解决这些问题。伟大的旧备用品是这样的:

  • 这页 第六段的第四个词是什么?
  • 这个网站的作者叫什么名字? [暗示]

这是愚蠢的——很容易实现,而机器很难解决。

至于强制强制,请尝试向您的用户表添加两个字段,’first_failed_login’ [ INTEGER unix 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
}

这将使您的登录系统每 10 分钟只能识别每位用户 3 次登录尝试。

原文由 Sammitch 发布,翻译遵循 CC BY-SA 4.0 许可协议

不要依赖会话或 cookie,它们信任客户端,你永远不应该信任客户端。我制作了一个类来处理 PHP 中的暴力攻击保护。

https://github.com/ejfrancis/BruteForceBlocker

它在数据库表中记录站点范围内所有失败的登录,如果过去 10 分钟(或您选择的任何时间范围)内失败的登录次数超过设定的限制,它会强制执行时间延迟和/或验证码要求再次登录之前。

例子:

  //build throttle settings array. (# recent failed logins => response).

 $throttle_settings = [

         50 => 2,            //delay in seconds
         150 => 4,           //delay in seconds
         300 => 'captcha'    //captcha
];

 $BFBresponse = BruteForceBlocker::getLoginStatus($throttle_settings);

//$throttle_settings is an optional parameter. if it's not included,the default settings array in BruteForceBlocker.php will be used

 switch ($BFBresponse['status']){

    case 'safe':
         //safe to login
         break;
     case 'error':
         //error occured. get message
         $error_message = $BFBresponse['message'];
         break;
     case 'delay':
         //time delay required before next login
         $remaining_delay_in_seconds = $BFBresponse['message'];
         break;
     case 'captcha':
         //captcha required
         break;

 }

原文由 ejfrancis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏