<?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
}
//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;
}
3 回答
会话不可靠,因为他们依赖cookie,CAPTCHAs经常被破坏[包括ReCAPTCHA] . 唯一可靠的方法看似简单:问一个问题 . 不要使用数学问题,因为计算机出于某种原因出人意料地善于解决这些问题 . 伟大的老备用品是这样的:
this page第六段中的第四个单词是什么?
本网站作者的名称是什么? [hint]
这是愚蠢的 - 易于实现,并且机器很难解决 .
至于强制执行,请尝试在用户表中添加两个字段,'first_failed_login' [
INTEGER
unix timestamp或DATETIME
]和'failed_login_count' . [INTEGER
]这将使您的登录系统每10分钟仅识别每个用户3次登录尝试 .
不要依赖会话或cookie,那些信任客户的人,你永远不应该信任客户 . 我创建了一个在PHP中处理暴力攻击保护的类 .
https://github.com/ejfrancis/BruteForceBlocker
它会在db表中记录站点范围内的所有失败登录,如果最近10分钟(或您选择的任何时间范围)的登录失败次数超过设定限制,则会强制执行时间延迟和/或验证码要求再次登录之前 .
例:
尝试检查您是否正在处理真正的浏览器 . 也许一些令人讨厌的java脚本挑战随机函数名称或某些东西可以阻止很多简单的脚本,除非他们远程控制真正的浏览器(这不常见),或在刮刀脚本中正确评估js / css .
我建议进一步阅读这个主题,并针对python mechanize或其他一些众所周知的刮刀工具测试你的解决方案 .
但可以肯定的是,没有针对自动攻击的真正解决方案 .