2009-08-14 19 views
8

¿Hay alguna forma de recopilar la dirección IP de un cliente conectado a su sitio web a través de un servidor proxy?Búsqueda de la dirección IP del cliente conectado a través de un proxy

Toda la configuración es una LAN interna y, a través de sysadmin, también tengo control sobre la máquina proxy. Estoy usando PHP5 para el lado del servidor del sitio web.

Intenté $_SERVER['REMOTE_ADDR'] en PHP pero esta variable solo almacena la dirección IP del proxy.

¿Alguna idea?

Respuesta

9

La solución estándar (en php) es:

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

Pero a medida que la primera respuesta dice que todo esto depende de la cabecera en realidad se está configurando.

+4

En realidad, esto no funciona: en lugar de 'HTTP_X_FORWARD_FOR', es 'HTTP_X_FORWARDED_FOR' – lauhub

12

Depende del proxy. Algunos proxies agregan un encabezado que da la dirección IP original, el encabezado X-Forwarded-For, pero dado que la mayoría de las empresas usa proxies para ocultar la estructura interna de la red que es rara. Si este es el caso, entonces no podrás hacerlo fácilmente.

Si tiene control sobre el proxy, entonces es hora de leer la documentación del proxy para ver cómo agregar ese encabezado.

+4

+1 correcto y muy bien explicado. – karim79

+0

¿PHP analiza el encabezado XFF en una variable de servidor? –

1

X-Forwarded-For es la única forma de obtener la dirección IP del cliente. Compruebe si hay una manera de habilitar eso en su proxy.

En algunos proxy, le da la opción de cómo manejar el encabezado XFF existente (cuando la solicitud pasa por múltiples proxies). Esto es lo que necesita considerar:

  1. Si la dirección del cliente es para fines de seguridad/confianza (como ACL o limitación de velocidad), el encabezado XFF existente debe eliminarse por proxy.
  2. Si la dirección es solo para información (registro, depuración), debe agregar la dirección del mismo nivel al XFF existente, separado por comas. La primera IP en la lista sería la IP del cliente.
0

Este código se puede utilizar para obtener la dirección IP del cliente que se conecta a través de un proxy.

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

Pero solo se detecta cuando el proxy es transparente.

A continuación se muestra la información de proxy HTTP:

  1. No se usa un servidor proxy:

    • request.getRemoteAddr() = dirección IP del cliente
    • request.getHeader("HTTP_X_FORWARDED_FOR") = Ningún valor o no muestran la
  2. Uso Transparent Pro xies:

    • HTTP_X_FORWARDED_FOR = dirección IP real del cliente proxy
  3. uso normal anónimos:

    • request.getRemoteAddr() = dirección IP del servidor proxy
    • HTTP_X_FORWARDED_FOR = dirección IP del servidor proxy
+3

Ummm ... eso es Java. La pregunta está etiquetada como PHP. – StackOverflowed

Cuestiones relacionadas