使用PHP中的随机会话标识跟踪访问者?

时间:2017-08-16 22:14:10

标签: php security

我在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));
}

这是一个很好的解决方案吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

这不是一个很好的解决方案,原因如下:

  • 它不会抓到坏人:除非您配置了特殊内容,否则会话通常存储在客户端的Cookie中。如果恶意的人想继续攻击您的网站,他们只是经常清除cookie。因此,这种方法可能无法检测到知道他们正在做什么的恶意用户。
  • 真的不会抓到坏人:真正了解他们所做的事情的人可以轻松访问很多不同的IP地址。您可以通过downloading Tor模拟并在几个不同的网站上查找您的IP地址。你每次都会得到不同的答案 - 可能来自世界各地。
  • 它可能阻止实际用户:如果IP阻止完全基于来自特定IP地址的一些失败登录尝试,当该IP地址对应于许多用户并且它们正常时会发生什么情况他们的密码错误?例如,在办公楼中,我们假设您有200个用户共享互联网连接,因此也共享一个IP地址。如果其中20个密码丢失了一次(在该IP上总共有20次登录失败),这是否会锁定所有200个用户?
  • 内容也很重要:恶意企图通常(但并非总是)以某种恶意内容为标记。例如,您可能会在表单字段中看到SQL injection的尝试。它很容易检测到那种语法并采取适当的行动。

全球众多组织采用的更好的解决方案是跟踪指定用户名的尝试次数,并在该用户名尝试次数过多后锁定该帐户< / em>的。一旦锁定,不同的应用程序使用不同的方法来解锁帐户:一些使用验证电子邮件,其他人只是等待一段时间,其他人要求用户也在每次新的登录尝试时完成captcha ...目标是减慢坏人,这样他们就不会蛮力地进入系统。

在设计这种系统时,你没有一个,而是两个目标:让坏人(和他们的机器人)远离,并最大限度地减少对用户的不便。将一个满是人的建筑物从一个应用程序中锁定可能符合第一个标准,但它在第二个标准上失败了。

有时候永远阻止整个IP(或者至少是永远的)是合适的。但是,如果您希望应用程序不会锁定用户,阻止IP并不是最好的起点。