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

Posted

技术标签:

【中文标题】如何使用php获取客户端的本地IP?【英文标题】:How to get the local IP of the client using php? 【发布时间】:2013-06-22 09:35:45 【问题描述】:

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

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

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

这是我使用的代码 sn-p :

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

【问题讨论】:

可能重复***.com/questions/55768/… 除非您可以让您所在机构的网络管理员转发 IP,否则这是不可能的。 【参考方案1】:

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

【讨论】:

请问在这种特殊情况下 NAT 是什么意思? NAT 表示网络地址转换,即 LAN 上的客户端隐藏在单个网关 IP 地址后面。将内网地址改写(翻译)为网关的公网IP地址,然后网关在收到回复时进行反向翻译。这对互联网的其余部分来说都是一个“不可见”的过程。【参考方案2】:

我不认为,nat 就是为此而生的。

【讨论】:

【参考方案3】:

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

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

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

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

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

【讨论】:

谢谢亚诺森。我同意你的看法。但是使用用户注册将大大减少我获得的参与量,因为它需要更多的时间。如果您能提出注册用户以外的其他方法,我会很高兴。 当然,这是一个商业决策。请注意权衡。例如,短信验证效果很好,而且价格也不贵。您可以验证用户一次,然后存储一个较长的过期 cookie 来识别他。像 Twillio 这样的服务让这变得非常容易。 存储 cookie 并不可靠,因为可以清除 cookie 并投多票。 如果他没有cookie,他必须通过电话号码验证以获得新的验证cookie。除非他可以使用两部手机,否则他不能投票两次。或者,您也可以每次都请求电话验证。 Evercookie 也值得探索。 您可以使用 javascript 获取内部 IP,然后使用 AJAX POST 传递给 php【参考方案4】:

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

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

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

【讨论】:

这并不能真正阻止任何人作弊,它太容易伪造了。否则,首先检查 IP 的意义何在?

以上是关于如何使用php获取客户端的本地IP?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 express 框架通过 node.js 获取远程客户端的本地 IP 地址?

php socket 获取客户端ip地址

使用javascript获取客户端的本地IP地址[重复]

如何在 PHP 中获取已连接客户端的 MAC 和 IP 地址?

如何使用 php 获取 NAT 后面的 ip?

PHP获取客户端的真实IP