关于获取客户端ip的思考

Posted by Alex Kinhoom on November 21, 2017

HTTP_CLIENT_IP

代表的是代理服务器发送的HTTP头,如果是超级匿名代理,则返回none值,该值若存在,REMOTE_ADDR也将会替换为这个代理服务器ip

HTTP_X_FORWARDED_FOR

代表的是用户在哪个ip使用的代理,其有可能存在,也有可能伪造

REMOTE_ADDR

代表的是最后客户端和服务器握手时候的ip,若此时使用了匿名代理REMOTE_ADDR将显示为代理代理服务器ip

优先级

程序通常处理的优先级 HTTP_CLIENT_IP > HTTP_X_FORWARDED_FOR > REMOTE_ADDR 其中HTTP_CLIENT_IP 未成标准 HTTP_X_FORWARDED_FOR 成为标准 格式为 clientip,proxy1,proxy2,这两种获取方式均不可靠REMOTE_ADDR 是可靠的,它是最后一个跟你的服务器握手的ip,可能是用户的代理服务器,也可能是自己的反向代理。 最后附上PHP通常获取clientIp的demo

function get_client_ip(){
     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($ip);
}