如何在PHP中获取客户端IP地址?

我如何使用PHP获取客户端IP地址?

我想保留通过他/她的IP地址登录我的网站的用户的记录。


无论你做什么,都要确保不要信任从客户端发送的数据。 $_SERVER['REMOTE_ADDR']包含连接方的真实IP地址。 这是你可以找到的最可靠的价值。

但是,它们可以位于代理服务器后面,在这种情况下,代理可能已经设置了$_SERVER['HTTP_X_FORWARDED_FOR'] ,但这个值很容易被欺骗。 例如,它可以由没有代理的人设置,或者IP可以是来自代理后LAN的内部IP。

这意味着如果您要保存$_SERVER['HTTP_X_FORWARDED_FOR'] ,请确保您还保存了$_SERVER['REMOTE_ADDR']值。 例如,通过将这两个值保存在数据库的不同字段中。

如果要将IP作为字符串保存到数据库,请确保至少有45个字符的空间。 IPv6在这里停留,这些地址比旧的IPv4地址大。

(请注意,IPv6通常最多使用39个字符,但IPv4地址也有一个特殊的IPv6符号,其完整格式最多可以有45个字符。因此,如果您知道自己在做什么,则可以使用39个字符,但如果您只想设置和忘记它,使用45)。


$_SERVER['REMOTE_ADDR']实际上可能不包含真实的客户端IP地址,因为它会为您通过代理连接的客户端提供代理地址。 这可能是你真正想要的,但取决于你对IP的处理方式。 有人的私人RFC1918地址可能不会对你有什么好处,试图查看你的流量来自哪里,或者记住用户上次连接的IP地址,代理或NAT网关的公共IP可能更多适合存储。

有几个HTTP头像X-Forwarded-For可以或不可以由各种代理设置。 问题是这些只是HTTP标头,可以由任何人设置。 他们的内容无法保证。 $_SERVER['REMOTE_ADDR']是Web服务器接收到连接的实际物理IP地址,并且该响应将被发送到。 其他任何事情都只是武断的和自愿的信息。 只有一种情况可以信任此信息:您正在控制设置此标头的代理。 只有当你知道100%在哪里以及如何设置标题时才有意义,只要你注意它的重要性。

话虽如此,下面是一些示例代码:

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

编者按:使用上面的代码有安全隐患 。 客户端可以将所有HTTP头信息(即$_SERVER['HTTP_... ))设置为任意值。 因此,使用$_SERVER['REMOTE_ADDR']要可靠得多,因为这不能由用户设置。

来自:http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html


echo $_SERVER['REMOTE_ADDR'];

http://php.net/manual/en/reserved.variables.server.php

链接地址: http://www.djcxy.com/p/58525.html

上一篇: How to get the client IP address in PHP?

下一篇: Check whether a request is GET or POST