2009-08-14 119 views
8

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

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

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

任何想法?

回答

9

标准溶液(在PHP)是:

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

但作为第一个答案说,这一切都取决于实际被设置的头。

+4

其实,这不起作用:而不是'HTTP_X_FORWARD_FOR',它是'HTTP_X_FORWARDED_FOR' – lauhub 2011-11-21 10:40:02

12

这取决于代理。一些代理添加了一个标题,该标题给出了原始IP地址X-Forwarded-For标题,但是考虑到大多数公司使用代理来隐藏罕见的内部网络结构。如果是这种情况,那么你不会轻易做到这一点。

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

+4

+1正确,并很好地解释。 – karim79 2009-08-14 06:55:10

+0

PHP是否将XFF头解析为服务器变量? – 2009-08-14 08:06:11

1

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

在某些代理服务器上,它提供了如何处理现有XFF标头(当请求经过多个代理服务器时)的选项。这里是你需要考虑的,

  1. 如果客户端地址是出于安全/信任的目的(如ACL或速率限制),现有的XFF头应该被代理丢弃。
  2. 如果地址仅用于提供信息(日志记录,调试),则应该将对等地址附加到现有的XFF,并用逗号分隔。列表中的第一个IP将是客户的IP。
0

此代码可用于获取通过代理连接的客户端的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() =客户端
    • request.getHeader("HTTP_X_FORWARDED_FOR")的IP地址= No值或无显示
  2. 使用Transparent Pro谢胱:客户

  3. 正常使用匿名代理

    • HTTP_X_FORWARDED_FOR =真实IP地址:

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

嗯..这是Java。问题的标签为PHP。 – StackOverflowed 2017-07-14 18:48:23