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

2021/01/14 01:41 · php ·  · 0评论

我有我的登录页面,当然我想防止暴力攻击,并在用户登录时为他们带来更少的延迟。

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

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

我的问题是:

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

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

会话不可靠,因为它们依赖Cookie,CAPTCHA经常被破坏[包括ReCAPTCHA]。唯一可靠的方法看似简单:问一个问题。因为电脑是不要用一个数学问题,令人惊讶的是解决那些由于某种原因娴熟。好的旧备用电池是这样的:

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

这很容易实现,而且对于机器来说也很难解决。

对于强制强制,请尝试在用户表中添加两个字段:“ first_failed_login” [ INTEGERunix 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次登录尝试。

不要依赖会话或cookie,那些会话或cookie会信任客户端,而您绝对不要信任客户端。我编写了一个讲授PHP蛮力攻击防护的课程。

https://github.com/ejfrancis/BruteForceBlocker

它将整个站点范围内所有失败的登录记录在db表中,并且如果最近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。

我建议进一步阅读该主题,并针对python机械化或其他一些知名的scraper工具测试您的解决方案。

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

本文地址:http://php.askforanswer.com/fangzhibaoligongjidezuijiafangfashishenme.html
文章标签: ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!