我想通过检查登录尝试者的IP来防止蛮力。然而,这对数据库来说将是一个巨大的问题;在发生攻击时会超载。还有其他解决方案吗?
服务器端会话?像
这样的东西$_SESSION['$IP'] = $_SESSION['$IP'] +1;
我不想使用验证码,因为它很烦人。
答案 0 :(得分:3)
哪些条款会使DB过载?每个IP地址只能保留一条记录,登录失败次数(成功登录后清除)。如果该号码到达您的垃圾箱,您可以阻止该帐户持续一小时,并在帐户被阻止时保留一个带有时间戳的字段。没有必要记录每次尝试,对吧?
答案 1 :(得分:1)
如果攻击来自一个它甚至不支持会话的脚本,那么就不能依赖会话。由于脚本可以不断更改其原始IP,因此无法依赖IP。
我创建了一个在PHP中处理暴力攻击保护的类。
https://github.com/ejfrancis/BruteForceBlocker
它会在db表中记录站点范围内的所有失败登录,如果在过去10分钟(或您选择的任何时间范围)中失败的登录次数超过设定限制,则会强制执行时间延迟和/或再次登录之前的验证码要求。
示例:
//构建油门设置数组。 (#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是一个可选参数。如果没有包含,将使用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;
}