0

我为我的研究所创建了一个投票系统,它使用客户的 IP 地址来识别唯一的选民。我用过$_SERVER['REMOTE_ADDR']

问题是该研究所使用局域网,因此所有用户都拥有相同的全球 IP。因此,只有一个用户可以投票。

如何获取投票人的本地IP?

这是我使用的代码片段:

if(!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['REMOTE_ADDR']; 
} else {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
4

4 回答 4

2

在 NAT 的情况下,您无法在服务器端代码中获取内部 IP。

于 2013-06-25T14:22:47.710 回答
2

IPv4的情况下,大多数客户端地址都隐藏在NAT后面,在您的服务器端,您只能看到全局可路由地址,即路由器自己的全局地址。

IPv6的情况下,所有意图和目的的本地地址都将与全局地址相同,因此您会在$_SERVER['REMOTE_ADDR'].

话虽如此,我还想提醒您不要对任何内容使用X-Forwarded-For标头,除非它来自受信任的来源(例如您自己的反向代理)。客户端可以将此标头设置为任意值,并可能导致触发一些有趣甚至危险的错误。

在一个实用的说明中,我想补充一点,使用 IP 地址来限制一个人可以投票的次数是一种有点不合时宜的做法,因为我目前租用了 16 个 IP 地址块,而且我知道有人可以得到他们的手一个完整的 C 大小的块(255 个地址),您将在提供商 NAT 等后面阻止很多人。在 IPv6 的情况下,无论如何每个人都将拥有数十亿个地址,因此 IP 阻塞的整个概念将被打破。

如果可能的话,我建议您将投票与电话号码或电子邮件注册等更稳定的东西联系起来。

于 2013-06-25T14:27:46.560 回答
0

无法获取共享连接后面的计算机的本地 IP。您还可以提出另一个提示来识别唯一选民: 1- 向选民机器发送一个带有密钥和唯一值的 cookie,并将其添加到全球 IP

$_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']

2-您可以添加另一个因素,例如倾向于不同的用户代理字符串(浏览器)和操作系统版本或获取本地计算机的标准主机名。

于 2013-06-25T14:58:33.750 回答
-1

你不能我想,nat 就是为此而生的。

于 2013-06-25T14:27:05.617 回答