05
2021
07

PHP如何获取客户端ip地址

一、如果没有使用代理服务器,
  REMOTE_ADDR = 客户端IP    HTTP_X_FORWARDED_FOR = 没数值或不显示
  $ip = $_SERVER['REMOTE_ADDR'];

二、使用透明代理,
  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163, 203.129.72.215)
  这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip。
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

三、使用普通匿名代理服务器,
  REMOTE_ADDR = 最后一个代理服务器 IP
  HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)
  这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的。

四、使用欺骗性代理服务器,
  REMOTE_ADDR = 代理服务器 IP
  HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时,这个值类似:220.4.251.159, 203.98.182.163, 203.129.72.215)
  服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假ip。

五、使用高匿名代理,
  REMOTE_ADDR = 代理服务器 IP       HTTP_X_FORWARDED_FOR = 没数值或不显示
  使用这种代理时,不同浏览器不同设备会返回不同的ip头信息,因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。

function getIP(){
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
        $ip = getenv("HTTP_CLIENT_IP");
    else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
        $ip = getenv("REMOTE_ADDR");
  
  else if (isset($_SERVER["REMOTE_ADDR"]) && 
$_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], 
"unknown"))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "unknown";
    return(preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '');
}


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。