繁体   English   中英

使用PHP获取用户真实的IP地址

[英]Getting Users Real IP address using PHP

即使他们使用像hidemyass.com这样的代理网站,我也想从我网站上的用户那里获得真实的IP地址

这是我的代码并认为它​​有效,但我测试了它,但它没有

<?php
function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
?>

我认为这段代码可行,但代理仍然绕过它。

提前致谢。

如果代理不想告诉你它(并且任何真正的匿名代理都不会 ),则无法保证获得“真实”IP地址。

你不能。 您拥有的信息来自apache / iis / whatever,它只知道谁与您的服务器通信,在这种情况下,它是代理服务器。 除非代理想要在标题中发送该信息,否则您将无法获得它。

X-Forwarded-For是您可以做的最好的,但它不太可能是匿名代理发送的。

除非您在编码IP地址的应用程序层实现某种身份验证协议(这受到欺骗行为的影响),否则您无法确定获得“真实”的IP地址。

为什么是这样?

因为IP数据包可以被访问它的“中间”的人任意重写。 例如,代理,路由器,网关等。

IP数据包具有这种结构

| stuff | src ip | dst ip  | stuff |
| ....  | 32-bits| 32 bits | stuff |

所以src ip - 那些只是位,记住 - 可以被任意覆盖。

http://www.faqs.org/rfcs/rfc791.html将提供更多信息。

除非代理将真正的IP地址放在标题中(常见 - 取决于代理使用的原因)(通常以某种形式的“X-something”),否则您只能看到代理的IP地址。

请试试这个

function get_IP_address()
{
  foreach (array('HTTP_CLIENT_IP',
               'HTTP_X_FORWARDED_FOR',
               'HTTP_X_FORWARDED',
               'HTTP_X_CLUSTER_CLIENT_IP',
               'HTTP_FORWARDED_FOR',
               'HTTP_FORWARDED',
               'REMOTE_ADDR') as $key){
    if (array_key_exists($key, $_SERVER) === true){
        foreach (explode(',', $_SERVER[$key]) as $IPaddress){
            $IPaddress = trim($IPaddress); // Just to be safe

            if (filter_var($IPaddress,
                           FILTER_VALIDATE_IP,
                           FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
                !== false) {

                return $IPaddress;
            }
        }
    }
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM