PHP-识别同一路由器下的单个用户(主IP地址)

PHP-识别同一路由器下的单个用户(主IP地址),php,Php,是否有可能在同一“路由器”或“主IP地址”上找到(或以其他方式识别)每个用户的IP地址 更新,澄清问题: 用例: 我希望能够跟踪在一个可能的公共网络上的N个单独的计算机用户中的每一个是否登录到一个页面上 目前,在S/O上使用其他PHP IP detect代码段,这似乎只能将网络上的所有N台计算机标识为来自同一IP地址。这无助于解决识别这些用户是否来自同一网络上的不同用户,或者是否是网络上的同一用户多次点击页面的问题 -- 注意:Cookie可能已禁用 大多数转发路由器web代理将把原始IP地址

是否有可能在同一“路由器”或“主IP地址”上找到(或以其他方式识别)每个用户的IP地址


更新,澄清问题:

用例: 我希望能够跟踪在一个可能的公共网络上的N个单独的计算机用户中的每一个是否登录到一个页面上

目前,在S/O上使用其他PHP IP detect代码段,这似乎只能将网络上的所有N台计算机标识为来自同一IP地址。这无助于解决识别这些用户是否来自同一网络上的不同用户,或者是否是网络上的同一用户多次点击页面的问题

--

注意:Cookie可能已禁用

大多数转发路由器web代理将把原始IP地址放在X-Forwarded-For报头中。使用PHP,您可以通过以下方式访问此原始地址:

$_SERVER['HTTP_X_FORWARDED_FOR']
我还应该提到,当请求通过其他路由器代理时,这个头很可能包含多个地址。由你自己决定你到底对哪个地址感兴趣


伪造标题也相当简单。

不一致。当涉及NAT时,最好避免依赖IP地址来识别特定客户机;取而代之的是考虑使用Cookie来存储每个客户端的会话ID,并使用该信息来区分共享单个IP的主机(或用户代理)。

< P>您的问题相当模糊,我可以想出几种不同的方式来解释这一点……/P>
  • 如果您有来自同一外部IP(即,他们在同一网络上)的多个请求,您能在该网络上找到他们的本地IP地址吗。你不能
  • 是否可以找到本地网络(服务器本地)上的每台计算机-您可以实施网络发现。最简单的方法可能是在所有可能的本地IP上打开一个套接字,看看会发生什么,然后据此做出判断。一个更好的方法可能是PING每个潜在的主机,但是我不知道有任何系统以特定的方式这样做,这意味着您可能需要自己做一些研究,以确定什么是最好的方式

  • 如果这不能回答您的问题,请告诉我您的目标是什么,我将调整我的答案。

    没有明确的方法来保证互联网上用户的唯一性

    没有办法区分机器人和真实用户

    鉴于计算机视觉和验证码规避培训的当前趋势,验证码似乎不再是识别机器人的有效工具

    在任何结合NAT的PAT(端口地址转换)之后,网络结构隐藏了内部计算机。可能存在
    USERAGENT
    变体,在内部指定唯一的计算机(假设它们不是伪造的)

    但是,从同一操作系统源克隆的一组二十台计算机,在PAT后面,看起来几乎相同,端口也会不同,因为源端口映射是随机的,并且当PAT翻译组合在一起时,在Internet web PHP服务器上仍然会显示为一台计算机

    无论用户是否相同,都无法建立信息:

    Cookie只允许识别绑定到特定浏览器和特定用户的特定计算机。如果用户想要三倍或四倍。。。他们自己能够在同一台计算机上运行不同的浏览器(即Safari、FireFox、Chrome和Opera)或多次登录(更不用说curl、wget和许多其他访问方法)。它仍然无法区分冒充多个用户的单个用户

    还有其他网络因素,如Tor出口点和代理服务器,使范例更加复杂

    考虑到人类倾向于相同的浏览模式,如果有足够的数据,这可以被确定为用户是相同的概率,但即使是这种概率也永远无法确定(更不用说随机机器人模式了)

    登录对“用户问题”有更大的影响,如果您要求每个用户都有一个经过验证的电子邮件登录,那么每次登录您都有更多的机会使用单个用户,特别是如果您排除了常见的公共电子邮件域,如hotmail.com和gmail.com等。私有域几乎不可能与不同的用户进行确认。信任的百分比随着已建立/已知的私有域的增加而增加(例如mit.edu)

    总之,单一用户识别的目标无法从互联网上的客户那里合理地实现


    有一些缓解技术可用,但没有一种是万无一失的。

    在4年前首次提出这个问题时,情况可能并非如此。但是现在大多数互联网都有一个IPv6地址。我知道大多数人目前也有IPv4地址。我会按IPv6地址检查连接。有了IPv6地址,即使在同一网络上,每台机器也应该获得不同的IP地址

    使用此代码验证您正在使用IPv6地址。如果是,不同的设备应该有不同的IP地址

    <?php
    //whether ip is from share internet
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   
      {
        $ip_address = $_SERVER['HTTP_CLIENT_IP'];
      }
    //whether ip is from proxy
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))  
      {
        $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
      }
    //whether ip is from remote address
    else
      {
        $ip_address = $_SERVER['REMOTE_ADDR'];
      }
    $ip_address = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
    
    // Validate ip as IPv6
    if (filter_var($ip_address , FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
        echo("$ip_address is a valid IPv6 address");
    } else {
        echo("$ip_address is not a valid IPv6 address");
    }
    ?>
    

    因此,我有一个日志文件,用于跟踪我网站上的用户,我会这样做以获取IP:

    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    
    您可以尝试跟踪以上三种情况,但如果同一网络上的用户使用一个IP,他们通常只使用最后一个IP,很少会显示单独的IP,因为这可能会带来安全风险

    对于同一网络上的不同用户,我还尝试跟踪会话id:

    $session_id = session_id();
    
    因此,即使多个用户的IP相同,他们也应该有不同的浏览会话

    如果你想追踪t