我在PHP中有一个自己的CMS,我在数据库中记录了可疑的尝试,例如: - 请求不存在的URL-s - 无效的登录电子邮件地址 - 等等。
如果有人试图破解我的系统,我想否认,但我必须确认他/她/它。 - 如果用户已登录,则通过USERNAME进行标识。 - 如果不是,但用户已获得IP地址,则通过IP地址进行识别。 - 如果没有,......我该怎么办?
如果用户未登录,并且 - 不是IP地址,我将生成唯一的随机标识符,并存储在SESSION变量中。
因此,一个函数正在收集对数据库的可疑尝试,如果有人获得了大量的尝试,我将用户名/ IP地址/会话标识符放入禁止列表。
对于ip地址:
function getUserIP() {
$ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
随机ID生成器是:
if (!isset ($_SESSION["short_lived_identifier"]))
{
$_SESSION["short_lived_identifier"] = bin2hex (openssl_random_pseudo_bytes (32));
}
这是一个很好的解决方案吗? 谢谢!
答案 0 :(得分:0)
这不是一个很好的解决方案,原因如下:
全球众多组织采用的更好的解决方案是跟踪指定用户名的尝试次数,并在该用户名尝试次数过多后锁定该帐户< / em>的。一旦锁定,不同的应用程序使用不同的方法来解锁帐户:一些使用验证电子邮件,其他人只是等待一段时间,其他人要求用户也在每次新的登录尝试时完成captcha ...目标是减慢坏人,这样他们就不会蛮力地进入系统。
在设计这种系统时,你没有一个,而是两个目标:让坏人(和他们的机器人)远离,并最大限度地减少对用户的不便。将一个满是人的建筑物从一个应用程序中锁定可能符合第一个标准,但它在第二个标准上失败了。
有时候永远阻止整个IP(或者至少是永远的)是合适的。但是,如果您希望应用程序不会锁定用户,阻止IP并不是最好的起点。