协慌网

登录 贡献 社区

如何在 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 的做法。如果您说,尝试查看您的流量源自哪里,或者记住用户上次连接的 IP,代理或 NAT 网关的公共 IP 可能更多,那么某人的私有 RFC1918 地址可能对您没有任何帮助。适合存放。

有几个 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