2011-02-15 8 views
6

¿Cuál sería el mejor enfoque para detectar si se accede a una aplicación web localmente?
Me interesa comprobar esto en un filtro (javax.servlet.Filter).
Podría consultar el ServletRequest#getRemoteAddr() si es 127.0.0.1, pero si se está ejecutando en una máquina IPv6, la dirección sería 0:0:0:0:0:0:0:1.
¿Hay alguna otra falla que deba tener en cuenta, o si solo compruebo estos 2 patrones de cuerda, estaría bien?java- utilizando un filtro para verificar la dirección remota

Gracias

Respuesta

11

En teoría, lo siguiente debería ser suficiente.

if (request.getRemoteAddr().equals(request.getLocalAddr())) { 
    // Locally accessed. 
} else { 
    // Remotely accessed. 
} 


actualización según los comentarios, request.getLocalAddr() parece volver 0.0.0.0 que puede suceder de hecho cuando el servidor está detrás de un proxy.

En su lugar, puede querer compararlo con las direcciones resueltas por InetAddress.

private Set<String> localAddresses = new HashSet<String>(); 

@Override 
public void init(FilterConfig config) throws ServletException { 
    try { 
     localAddresses.add(InetAddress.getLocalHost().getHostAddress()); 
     for (InetAddress inetAddress : InetAddress.getAllByName("localhost")) { 
      localAddresses.add(inetAddress.getHostAddress()); 
     } 
    } catch (IOException e) { 
     throw new ServletException("Unable to lookup local addresses"); 
    } 
} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { 
    if (localAddresses.contains(request.getRemoteAddr())) { 
     // Locally accessed. 
    } else { 
     // Remotely accessed. 
    } 
} 

En mi caso, el localAddresses contiene lo siguiente:

[192.168.1.101, 0:0:0:0:0:0:0:1, 127.0.0.1] 
+0

¿No podríamos tener el caso de que la IP del cliente es localhost y el servidor es otro, p. la IP pública? – Cratylus

+0

Entonces solo hay medios de acceso remoto. ¿O no es eso lo que estás preguntando? – BalusC

+0

Parece que esto no es correcto. El 'request.getLocalAddr()' siempre devuelve '0.0.0.0' – Cratylus

1

También es necesario comprobar todas las demás direcciones IP de su caja como la de sus interfaces Ethernet. También considere los alias.

+0

@Heico: ¿Quiere decir obtener todas las interfaces registrados para la máquina? Y luego comparar con la dirección remota? – Cratylus

+0

esencialmente. La ruta de red a través de la cual el cliente se conecta con el servidor puede incluir cualquiera de sus interfaces de red activas, no tiene que ser localhost. – jwenting

+0

Yo hice un bucle en todas las interfaces pero el '127.0.0.1' no está entre el conjunto. – Cratylus

1

Incluso si el cliente se ejecuta localmente, es posible que no esté utilizando la interfaz de bucle invertido. Es probable que su máquina tenga una dirección IP asignada, y dependiendo de la configuración de/etc/hosts, la configuración de DNS, etc., la dirección IP a la que se conecte podría no ser la dirección de bucle invertido.

Suponiendo que desea proporcionar algún tipo de interfaz "mejorada" que sea "más segura" porque se origina en la misma máquina, tenga en cuenta que incluso las interfaces de bucle invertido se pueden interceptar utilizando herramientas como wireshark. Si esta interfaz está destinada a mostrar datos adecuados para un cliente más confiable, entonces las probabilidades son buenas, debería hacer los esfuerzos para hacer un túnel ssl adecuado a través de https.

+0

La dirección IP a la que se conecta el cliente, puede no ser la dirección de bucle invertido.Ok.Pero la IP de origen (es decir, IP del cliente) siempre será la dirección de bucle invertido. ¿Derecha? – Cratylus

+0

Puede ser que no entiendo tu respuesta. ¿Estás hablando del cliente? – Cratylus

+0

Cuando el cliente se conecta, tendrá una dirección IP de retorno. Hay poca capacidad para controlar en el servidor lo que el cliente identifica como su dirección IP de retorno. –

Cuestiones relacionadas