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

2022-08-30 12:44:38

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

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


答案 1

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

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

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

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

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


答案 2

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

有几个HTTP标头,它们可能由各种代理设置,也可能不由各种代理设置。问题在于,这些只是任何人都可以设置的HTTP标头。无法保证其内容。 是 Web 服务器从中接收连接并将发送响应的实际物理 IP 地址。其他任何东西都只是任意和自愿的信息。只有一种情况可以信任此信息:您正在控制设置此标头的代理。这意味着只有当您知道100%标题的设置位置和方式时,您才应该注意任何重要的事情。X-Forwarded-For$_SERVER['REMOTE_ADDR']

话虽如此,这里有一些示例代码:

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


推荐