2009-08-14 116 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