Php 防止暴力攻击的登录解决方案

Php 防止暴力攻击的登录解决方案,php,Php,这将是一个很好的得到这种解决方案的利弊。此外,还可以了解该解决方案在防止攻击方面有多大用处,以及它有多大帮助 每个用户名用户都有唯一的url登录。下面是一个例子 我看到这样的优点: 多个用户可以使用同一用户名 对于每个用户名,黑客必须使用不同的url,这里的问题是:这对黑客来说有多困难?也许写特殊的程序很容易 与sigle login.php相比,获取要登录的URL需要花费很多时间 .... 可能还有更多的专业人士 从我的观点来看,缺点是为每个用户名创建单独的子域。最好像www.page.com

这将是一个很好的得到这种解决方案的利弊。此外,还可以了解该解决方案在防止攻击方面有多大用处,以及它有多大帮助

每个用户名用户都有唯一的url登录。下面是一个例子

我看到这样的优点:

多个用户可以使用同一用户名 对于每个用户名,黑客必须使用不同的url,这里的问题是:这对黑客来说有多困难?也许写特殊的程序很容易 与sigle login.php相比,获取要登录的URL需要花费很多时间 .... 可能还有更多的专业人士 从我的观点来看,缺点是为每个用户名创建单独的子域。最好像www.page.com/user/这样使用。例如,如果100000个用户需要相同的用户名,也可以这样做。将url命名为..../username的更好解决方案是什么

问题是如何编码它?来自mysql的用户名;将用户名添加到url。。。那么

很高兴知道你的意见


希望这不会被视为离题或问题的重复…

使用暴力攻击的黑客将已经知道他们试图入侵的用户名。他们只是粗暴地强制输入密码,所以这并不是一种有效的防御措施


更好的方法可能是对登录尝试进行限制,但将其设置为普通用户无法看到的高度,如100。

只是一个想法。。。为什么不在x次攻击失败后禁止攻击IP?或者,可能更容易,需要验证码等人工验证来中断脚本攻击。虽然我使用了新的HTML5拖放作为Captcha的替代方案,但我并不擅长实际的编码,但总体思路应该是可行的,是吗?

我制作了一个类,负责PHP中的暴力攻击保护

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

例如:

//构建油门设置数组。最近失败的登录=>响应

$throttle\u设置=[

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

$BFBresponse=BruteForceBlocker::getLoginStatus$throttle\u设置

//$throttle_settings是一个可选参数。如果未包含,将使用BruteForceBlocker.php中的默认设置数组

开关$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;
}


像这样的伪代码呢

    $searchresult = mysql_query($searchquery) or die(mysql_error());
    if (mysql_num_rows($searchresult) == 0) {
       echo "no rows found";  (DIE)
    }

    else {
    $attemptTime = "SELECT TimeStamp FROM UserLogTable WHERE `UserName` LIKE '%{$userName}%'";
    $attempts = "SELECT attempts FROM UserLogTable WHERE `UserName` LIKE '%{$userName}%'";

    if ( $attemptTime < time()-10 ){  // Reset attempt after 10 min
attempts = 0;
   "INSERT "$attempts" INTO attempts / UserLogTable WHERE `UserName` LIKE '%{$userName}%'";
}

     if (attempts > 3) { 
     echo "Too many attempts you must wait 5 minutes")

      else { 
       Run database check on password 
          if ( password failed ) {
          $attempts++
          "INSERT "$attempts" INTO attempts / UserLogTable WHERE `UserName` LIKE '%{$userName}%'";
          DIE("Bad Login")
          else { 
           $attempts = 0
          "INSERT "$attempts" INTO attempts / UserLogTable WHERE `UserName` LIKE '%{$userName}%'"; // reset attempts
           login user 
           }

它不是一个单独的子域,也不是一个单独的文件。它是在查询中传递的GET参数。然后Apache重写查询,让您在浏览器中看到它。根据您的建议,我理解这样的过程:1用户选择企业名称;2检查mysql中是否存在该业务名称,如果存在,在该业务名称中添加内容,并在mysql中记录;3基本url是/login.php从mysql获取业务名称,并带有变量add to/login.php,如/login.php?u='。$businessname 4带有htaccess change rewrite url我不太了解。但如果只有一个登录页面供所有用户使用,并且有许多用户请求该页面,那么它可能会冻结并减慢速度?而且黑客已经知道用户名。我的意思是黑客尝试一个用户名,因为尝试失败而被禁止5-10分钟。然后黑客只需在同一登录页面中获取下一个用户名。在多个登录页面的情况下,黑客必须转到其他url。。。问题是:黑客如何知道用户名。他们可能只是猜测?对于同一个页面有10000个请求,对于10000个独立但相同的页面有10000个请求是同一回事,您不会因为有单独的页面而节省资源。其次,允许人们拥有相同的用户名会增加被黑客攻击的几率,每个用户共享一个用户名,黑客成功的几率就会增加。第三,如果你在网站中有任何类型的区域暴露用户名,比如一个论坛,他们将从那里获得用户名,即使他们必须创建一个假帐户,如果不是,那就是一个小保护。嗯。。。好的,谢谢你的意见。请允许我解释一下它是如何增加被黑客攻击的几率的?从我的观点来看,验证可能是这样的:如果url是针对某个用户名,但键入了其他用户名,甚至是正确的密码,那么验证就会失败。每次你猜到一个密码,你成功的几率是1/pwnum。如果有两个用户使用相同的用户名,则几率加倍为2/pwnum,如果有3个用户,则几率变为3/pwnum,并且随着每个额外用户的增加而增加。