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

时间:2015-03-26 01:59:38

标签: php

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


更新,澄清问题:

用例: 我希望能够跟踪可能公共网络中的每个N个计算机用户是否已登陆页面。

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

-

注意:Cookie可能已停用。

6 个答案:

答案 0 :(得分:2)

的明确方法可以确保互联网上用户的唯一性。

无法分辨出机器人和真实用户之间的区别。

鉴于计算机视觉和验证码避免训练的最新趋势,似乎验证码不再是识别机器人的有效工具。

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

但是,从源源端口映射随机化的情况下,从同一操作系统源克隆并位于PAT后面的二十台计算机的集合将看起来几乎相同,端口将有所不同,并且当与PAT转换复合时,端口仍将在Internet Web PHP服务器上显示为一台计算机。

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

Cookie仅允许识别绑定到特定浏览器和特定用户的特定计算机。如果用户自己想将其变成三倍或四倍...,他们就可以在同一台计算机上运行不同的浏览器(即IE,Safari,FireFox,Chrome和Opera)或多个登录名(更不用说curl,wget和其他许多浏览器了)访问方法)。仍然无法区分冒充多个用户的单个用户。

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

鉴于人类倾向于相同的浏览模式,给定足够的数据,可以将其确定为用户相同的概率,但即使这种概率也永远无法确定(更不用说随机机器人模式了)。

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

结论是,Internet上的客户无法合理地实现唯一用户标识的目标

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

4年前首次提出这个问题时,情况可能并非如此。但是现在,大多数Internet都具有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");
}
?>

答案 3 :(得分:0)

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

$_SERVER['HTTP_X_FORWARDED_FOR']

我还应该提一下,这个标头很可能包含多个地址,因为请求会通过其他路由器代理。由你决定你真正感兴趣的地址。

伪造标题也是相当微不足道的。

答案 4 :(得分:0)

你的问题相当模糊,我可以想到一些不同的解释方法......

  1. 鉴于您有来自同一外部IP的人的多个请求(即他们在同一网络上),您能在该网络上找到他们的本地IP地址吗?的没有即可。你不能。
  2. 是否可以找到本地网络上的每台机器(服务器本地)? - 您可以实施网络发现。绝对最简单的方法可能是在所有可能的本地IP上打开一个套接字,看看会发生什么,并根据它做出判断。一个更好的方法可能是PING每个潜在的主机,但是我不知道任何系统特定的方法,这意味着你可能需要自己做一些研究,以了解最佳方式。
  3. 如果这不能回答你的问题,请告诉我你的目标是什么,我会调整我的答案。

答案 5 :(得分:0)

所以我有一个日志文件,用于跟踪我网站上的用户,并且我做这样的事情来获取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,因为这可能会带来安全风险。< / p>

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

$session_id = session_id();

因此,即使多个用户的IP是相同的,他们也应该具有不同的浏览会话。

如果您想在多个会话中跟踪同一用户,则可以尝试设置唯一的cookie,即使是新会话,该用户计算机上的cookie仍应存在(假定他们尚未清除缓存等), ),但是正如您在问题中所说的,如果禁用了cookie,则不是一种选择。