2009-08-14 10 views
8

Gibt es eine Möglichkeit, die IP-Adresse eines Clients zu erfassen, der über einen Proxy-Server mit Ihrer Website verbunden ist?IP-Adresse des über einen Proxy-Server verbundenen Clients finden

Das gesamte Setup ist ein internes LAN und über den Sysadmin habe ich auch die Kontrolle über den Proxy-Rechner. Ich benutze PHP5 für die Website-Server-Seite.

Ich versuchte $_SERVER['REMOTE_ADDR'] in PHP, aber diese Variable speichert nur die IP-Adresse des Proxy.

Irgendwelche Ideen?

Antwort

9

Die Standardlösung (in PHP) ist:

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

Aber als erste Antwort sagt dies auf dem Kopf hängt alles tatsächlich eingestellt wird.

+4

Eigentlich funktioniert das nicht: anstelle von 'HTTP_X_FORWARD_FOR' ist es 'HTTP_X_FORWARDED_FOR' – lauhub

12

Es hängt vom Proxy ab. Einige Proxies fügen einen Header hinzu, der die ursprüngliche IP-Adresse angibt, den X-Forwarded-For-Header, aber da die meisten Unternehmen Proxies verwenden, um die interne Netzwerkstruktur zu verbergen, die selten ist. Wenn dies der Fall ist, wirst du es nicht leicht machen können.

Wenn Sie die Kontrolle über den Proxy haben, dann ist es Zeit, die Proxy-Dokumentation zu lesen, um zu sehen, wie Sie diesen Header hinzufügen.

+4

+1 richtig und schön erklärt. – karim79

+0

Kopiert PHP den XFF-Header in eine Servervariable? –

1

X-Forwarded-For ist die einzige Möglichkeit, die IP-Adresse des Clients zu erhalten. Überprüfen Sie, ob es eine Möglichkeit gibt, das in Ihrem Proxy zu aktivieren.

Auf einigen Proxy gibt es Ihnen Option, wie mit vorhandenen XFF-Header behandelt werden (wenn Anforderung mehrere Proxys durchläuft). Hier ist, was Sie beachten müssen,

  1. Wenn die Client-Adresse für Sicherheit/Vertrauensstellungszweck (wie ACL oder geschwindigkeitsbestimmend) ist, bestehende XFF Header sollte durch einen Bevollmächtigten fällt gelassen werden.
  2. Wenn die Adresse nur zur Information dient (Protokollierung, Debugging), sollten Sie die Peer-Adresse an existierendes XFF anfügen, getrennt durch Komma. Die erste IP in der Liste wäre die IP des Clients.
0

Dieser Code kann verwendet werden, um die IP-Adresse des Clients abzurufen, der eine Verbindung über einen Proxy herstellt.

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; 
    } 

Aber es erkennt nur, wenn Proxy transparent ist.

Im Folgenden finden Sie die Informationen über HTTP-Proxy:

  1. Nicht alle Proxy-Server:

    • request.getRemoteAddr() = IP-Adresse des Clients
    • request.getHeader("HTTP_X_FORWARDED_FOR") = kein Wert oder keine Anzeige
  2. Verwenden Sie Transparent Pro xies:

    • HTTP_X_FORWARDED_FOR = Echt IP-Adresse des Clients
  3. Verwendung Normale Anonymous Proxies:

    • request.getRemoteAddr() = IP-Adresse des Proxy-Servers
    • HTTP_X_FORWARDED_FOR = IP-Adresse des Proxy-Servers
+3

Ummm .. das ist Java. Frage ist als PHP markiert. – StackOverflowed

Verwandte Themen