PHP getenv HTTP_X_FORWARDED_FOR包含字母表

时间:2017-06-09 13:17:29

标签: php ip

$ipaddress = '';
        if ( getenv('HTTP_CLIENT_IP') ) {
            $ipaddress = getenv('HTTP_CLIENT_IP');
        } else if( getenv('HTTP_X_FORWARDED_FOR') ) {
            $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
            $ipaddress = explode(",", $ipaddress);
            $ipaddress = $ipaddress[0];
        } else if( getenv('HTTP_X_FORWARDED') ) {
            $ipaddress = getenv('HTTP_X_FORWARDED');
        } else if( getenv('HTTP_FORWARDED_FOR') ) {
            $ipaddress = getenv('HTTP_FORWARDED_FOR');
        } else if( getenv('HTTP_FORWARDED') ) {
            $ipaddress = getenv('HTTP_FORWARDED');
        } else if( getenv('REMOTE_ADDR') ) {
            $ipaddress = getenv('REMOTE_ADDR');
        } else {
            $ipaddress = 'UNKNOWN';
        }
        return ip2long($ipaddress);


http_client_ip - null
http_x_forwarded_for - 2604:2000:6147:df00:25ee:04a4:ea44:6947, 162.158.62.236
http_x_forwarded - null
http_forwarded_for - null
http_forwarded - null
remote_addr 112.121.183.210

嗨,我是ip的新手,不知道如何获得真正的IP地址。

  1. 我不知道为什么http_x_forwarded_for返回2 ip?

  2. 为什么http_x_forwarded_for第一个包含字母?

  3. 为什么http_client_ip, http_x_forwarded, http_forwarded_for, http_forwarded为空?

  4. 为什么remote_addrhttp_x_forwarded_for不同?

  5. 哪一个是正确的IP地址

1 个答案:

答案 0 :(得分:1)

如果您正在处理代理,那么只要转发请求,这些代理就可以添加X-Forwarded-For标头。例如:

client -> proxy -> proxy -> server

这里有两个代理,可能一个在客户端,一个在服务器的数据中心,或者在客户端,或者在数据中心,或者你遇到的任何其他组合。

然后,您的服务器(PHP)将远程IP视为最近的代理。这就是从它获得“物理”连接的地方。

为了好,两个代理都将他们获取请求的地址添加到HTTP头。 “字母”地址是IPv6 address

如果你知道谁设置了这些标题,你应该只信任这些标题。唯一有保证的地址是REMOTE_ADDR,因为这是实际的连接。其他人只是任何人都可以设置的HTTP标头,包括客户端本身。除非您知道自己的数据中心有代理,并且知道它准确设置了哪个标头,否则您应该忽略它们。