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

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

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

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

我的问题是:

  • 你是以什么为基础的。 IP地址? 它始终可以隐藏...用户名? 如果他们正在尝试一个不存在的用户呢?

  • 计算失败登录尝试次数的最佳方法是什么?


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

  • 这页上第六段的第四个字是什么?
  • 这个网站的作者的名字是什么? [暗示]
  • 这很愚蠢 - 容易实现,而且机器很难解决。

    至于bute-forcing,尝试在用户表中添加两个字段'first_failed_login'[ INTEGER unix timestamp或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次登录尝试。


    不要依赖会话或cookies,那些信任客户,你永远不要信任客户。 我在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;
    
     }
    

    尝试检查你是否正在处理一个真实的浏览器。 也许一些令人讨厌的java脚本挑战随机函数名称或其他东西可能会阻止很多简单的脚本,除非它们远程控制真正的浏览器(这并不罕见),或者在scraper脚本中正确评估js / css。

    我会推荐进一步阅读这个主题,并测试你的解决方案对蟒机械或一些其他着名的刮刀工具。

    但可以肯定的是,对于自动攻击没有真正的解决方案。

    链接地址: http://www.djcxy.com/p/21659.html

    上一篇: What is the best method to prevent a brute force attack?

    下一篇: How to prevent brute force attacks on ajax form submission?