如何使用PHP获取客户端的本地IP?

时间:2013-06-25 14:21:16

标签: php

我为我的学院创建了一个轮询系统,它使用客户的IP地址来识别独特的选民。我使用过$_SERVER['REMOTE_ADDR']

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

如何获得投票人的本地知识产权?

以下是我使用过的代码段:

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

对于 IPv6 ,所有意图和目的的本地地址将与全局地址相同,因此您可以在$_SERVER['REMOTE_ADDR']中找到。

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

实际注意事项我想补充说,使用IP地址来限制投票的次数是一种有点破碎的做法,因为我现在租了一块16个IP地址而且我知道那些能够获得完整C大小块(255个地址)的人,你会阻止很多人在提供商NAT之后等等。在IPv6的情况下,无论如何每个人都将拥有数十亿的地址,因此整个IP拦截的概念将会更加破碎。

如果可能,我建议您将投票与电话号码或电子邮件注册等更稳定的投票相结合。

答案 2 :(得分:0)

无法在共享连接后面获取计算机的本地IP。 你可以提出另一个提示来确定独特的选民: 1-使用密钥和唯一值将cookie发送到选民机器将此添加到全局IP

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

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

答案 3 :(得分:-1)

你不能这么认为,nat就是为此而生的。