我为我的学院创建了一个轮询系统,它使用客户的IP地址来识别独特的选民。我使用过$_SERVER['REMOTE_ADDR']
。
问题是该机构使用局域网,因此所有用户都拥有相同的全球IP。 因此,只有一个用户可以投票。
如何获得投票人的本地知识产权?
以下是我使用过的代码段:
if(!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
答案 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就是为此而生的。