查找通过代理连接的客户端的IP地址

时间:2009-08-14 06:31:31

标签: php proxy ip-address

有没有办法通过代理服务器收集连接到您网站的客户端的IP地址?

整个设置是内部局域网,通过系统管理员,我也可以控制代理机器。我在网站服务器端使用PHP5。

我在PHP中尝试了$_SERVER['REMOTE_ADDR'],但这个变量只存储了代理的IP地址。

有什么想法吗?

4 个答案:

答案 0 :(得分:12)

这取决于代理。一些代理添加了一个标题,该标题提供了原始IP地址,即X-Forwarded-For标头,但考虑到大多数公司使用代理来隐藏罕见的内部网络结构。如果是这种情况,那么您将无法轻松完成。

如果您可以控制代理,那么就该阅读代理文档以了解如何添加该标题。

答案 1 :(得分:12)

标准解决方案(在php中)是:

if ($_SERVER['HTTP_X_FORWARDED_FOR']){
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} 
else{ 
    $ip = $_SERVER['REMOTE_ADDR'];
}

但是,第一个答案说这一切都取决于实际设置的标题。

答案 2 :(得分:1)

X-Forwarded-For是获取客户端IP地址的唯一方法。检查是否有办法在您的代理中启用它。

在某些代理上,它为您提供了如何处理现有XFF标头的选项(当请求通过多个代理时)。以下是您需要考虑的事项,

  1. 如果客户端地址是出于安全/信任目的(如ACL或速率限制),则应通过代理删除现有的XFF标头。
  2. 如果地址仅供参考(记录,调试),则应将对等地址附加到现有XFF,以逗号分隔。列表中的第一个IP将是客户端的IP。

答案 3 :(得分:-1)

此代码可用于获取通过代理连接的客户端IP地址。

  public static String getClientIpAddr(HttpServletRequest request) {  
     String ip = request.getHeader("X-Forwarded-For");  

     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("Proxy-Client-IP");  
     }  

     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
     }  
     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
     }  

     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
     }

     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
        ip = request.getRemoteAddr();  
     }  

     return ip;  
  }  

但它只检测代理是否透明。

以下是有关HTTP代理的信息:

  1. 不使用任何代理服务器:

    • request.getRemoteAddr() =客户端的IP地址
    • request.getHeader("HTTP_X_FORWARDED_FOR") =无值或无显示
  2. 使用透明代理:

    • HTTP_X_FORWARDED_FOR =客户端的真实IP地址
  3. 使用普通匿名代理:

    • request.getRemoteAddr() =代理服务器的IP地址
    • HTTP_X_FORWARDED_FOR =代理服务器的IP地址