PHP 获取客户端的真实IP

static protected function getIP()
{
  $ip;
  if (getenv("HTTP_CLIENT_IP"))
    $ip = getenv("HTTP_CLIENT_IP");
  else if(getenv("HTTP_X_FORWARDED_FOR"))
    $ip = getenv("HTTP_X_FORWARDED_FOR");//透过代理服务器取得客户端的真实 IP 地址
  else if(getenv("REMOTE_ADDR"))
    $ip = getenv("REMOTE_ADDR");//客户端使用的当前服务器地址(包括代理地址)
  else $ip = "Unknow";

  return $ip;
}

REMOTE_ADDR不可以显式的伪造,虽然可以通过代理将ip地址隐藏,但是这个地址仍然具有参考价值,因为它就是与你的服务器实际连接的ip地址。

HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR都可以通过http header来伪造。项目中很多服务器隐藏在负载均衡后面,你通过REMOTE_ADDR只能获取到负载均衡节点的ip地址,一般的负载均衡节点会把前端实际的ip地址通过HTTP_CLIENT_IP或者HTTP_X_FORWARDED_FOR这两种http头传递过来

这个值就是真实的,因为它是负载均衡节点告诉你的而不是客户端。但当你的服务器直接暴露在客户端前面的时候,请不要信任这两种读取方法,只需要读取REMOTE_ADDR就行了

HTTP_CLIENT_IP:可通过http头伪造
HTTP_X_FORWARDED_FOR:可通过http头伪造
REMOTE_ADDR:可能是用户真实IP也可能是代理IP