防止暴力攻击的最佳方法是什么?
2022-08-30 13:08:56
我有我的登录页面,当然我想防止暴力攻击,并在用户登录时减少延迟。
目前,您输入用户名和密码进行登录。
我正在考虑实施一个reCAPTCHA。但是,这在 3 次尝试失败后登录时显示。
我的问题是:
您尝试的基础是什么。IP 地址?它总是可以被隐藏的...用户名?如果他们正在尝试不存在的用户,该怎么办?
计算失败登录尝试的最佳方法是什么?
我有我的登录页面,当然我想防止暴力攻击,并在用户登录时减少延迟。
目前,您输入用户名和密码进行登录。
我正在考虑实施一个reCAPTCHA。但是,这在 3 次尝试失败后登录时显示。
我的问题是:
您尝试的基础是什么。IP 地址?它总是可以被隐藏的...用户名?如果他们正在尝试不存在的用户,该怎么办?
计算失败登录尝试的最佳方法是什么?
会话是不可靠的,因为它们依赖于cookie,CAPTCHA经常被破坏[包括ReCAPTCHA]。唯一可靠的方法看似简单:问一个问题。不要使用数学问题,因为计算机出于某种原因非常擅长解决这些问题。伟大的旧待机是这样的:
这是愚蠢的 - 易于实现,并且对于机器来说很难解决。
至于强迫,请尝试向用户表添加两个字段,“first_failed_login”[unix时间戳或]和“failed_login_count”。[INTEGER
DATETIME
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,那些信任客户端的人,你永远不应该信任客户端。我制作了一个类,负责PHP中的暴力攻击保护。
https://github.com/ejfrancis/BruteForceBlocker
它会在数据库表中记录站点范围内的所有失败登录,如果过去 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;
}