Fer*_*Fer 7 php login-attempts
我正在开发一个用PHP构建的相当大的网站,可能会有很多用户.我正在研究一种保护登录屏幕免受自动尝试的方法.我已经在注册表中加入了CAPTCHA检查,但希望更多地加强网站.
我知道StackOverflow上有类似的问题,我知道我有能力从头开始实现这个(存储登录尝试和他们在数据库中的时间),但我不喜欢这条路径:
任何建议都表示赞赏,我认为我特别想找到某种可以做到这一点的Apache模块.我的平台是PHP5(使用CodeIgniter),Apache2,MySQL 5.
ste*_*efs 16
更新:不要使用sleep()进行速率限制!这根本没有意义.我手边没有更好的解决方案.
一个良好的开端将是sleep(1);在登录尝试失败后 - 易于实现,几乎没有错误.
1秒对于人类来说并不多(特别是因为人类的登录尝试经常不会失败),但是1秒/尝试暴力......懒散!字典攻击可能是另一个问题,但它在同一个域中.
如果攻击者启动也可以通过连接来规避这种情况,那么就可以处理一种DOS攻击.问题解决了(但现在你有另一个问题).
你应该考虑的一些东西:
我的建议:
完全锁定是不可取的(DOS),所以更好的选择是:从唯一的IP计算某个用户名的登录尝试.你可以用一个简单的表来做到这一点failed_logins: IP/username/failed_attempts
如果登录失败,wait(failed_attempts);秒.每隔xx分钟,运行一个减少一个的cron脚本failed_logins:failed_attempts.
对不起,我无法提供预制解决方案,但这应该是无足轻重的.
好吧好吧.这是伪代码:
<?php
$login_success = tryToLogIn($username, $password);
if (!$login_success) {
// some kind of unique hash
$ipusr = getUserIP() . $username;
DB:update('INSERT INTO failed_logins (ip_usr, failed_attempts) VALUES (:ipusr, 1) ON DUPLICATE KEY UPDATE failed_logins SET failed_attempts = failed_attempts+1 WHERE ip_usr=:ipusr', array((':ipusr' => $ipusr));
$failed_attempts = DB:selectCell('SELECT failed_attempts WHERE ip_usr=:ipusr', array(':ipusr' => $ipusr));
sleep($failed_attempts);
redirect('/login', array('errorMessage' => 'login-fail! ur doin it rong!'));
}
?>
Run Code Online (Sandbox Code Playgroud)
免责声明:这可能在某些地区不起作用.我听到的最后一件事是在亚洲有一个整个国家NATed(他们都知道功夫).