2009-10-09 19 views
8

Tengo un SocketServer que acepta las conexiones entrantes. Por razones de seguridad, solo debería permitir conexiones locales (conexiones desde la máquina en la que se ejecuta el servidor).Cómo determinar una conexión entrante desde la máquina local

¿Cómo puedo determinar si una conexión entrante es de otra máquina? ¿El siguiente código es seguro para esto?

Socket socket = someServerSocket.accept(); 
String remoteAddress = socket .getInetAddress().getHostAddress(); 
if (!fromThisMachine(remoteAddress)) { 
    // Not from this machine. 
} 

mientras fromThisMachine() método es la siguiente:

public boolean fromThisMachine(String remoteAddress) { 
    try { 
     Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 
     while (interfaces.hasMoreElements()) { 
      NetworkInterface networkInterface = interfaces.nextElement(); 
      Enumeration<InetAddress> addresses = networkInterface.getInetAddresses(); 
      while (addresses.hasMoreElements()) { 
       InetAddress inetAddress = addresses.nextElement(); 
       String hostName = inetAddress.getHostName(); 
       String hostAddr = inetAddress.getHostAddress(); 
       if (hostName.equals(remoteAddress) || hostAddr.equals(remoteAddress)) { 
        return true; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
    log("Unauthorized request to server from: " + remoteAddress); 
    return false; 
} 

Gracias, Mohsen

Respuesta

7

Si desea limitar las conexiones desde el host local, a continuación, especificar que cuando se abre el ServerSocket. Si solo escuchas en localhost, entonces solo obtendrás conexiones de localhost.

int port = ..... 
    SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port); 
    ServerSocket serverSocket = new ServerSocket(); 
    serverSocket.bind(socketAddress); 
    serverSocket.accept(); 
+0

No funciona. Ver: Estoy en 192.168.0.1 y alguien más en 192.168.0.2. Quiero negarle el acceso al socket de mi servidor escuchando en 192.168.0.1:port, pero esta solución no funciona. Solo causó que la conexión a 127.0.0.1:port no funcione desde mi propia máquina. – Mohsen

+1

Esto no responde a la pregunta. Por qué está incorrectamente marcado Las otras torres también son incorrectas, en este caso debe dejarse abierta y sin respuesta para todas las demás personas que tengan el mismo problema. – Lothar

3

Gracias skaffman. El siguiente código funcionaba con un poco de manipulación (hard-coding 127.0.0.1).

int port = ..... 
SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port); 
ServerSocket serverSocket = new ServerSocket(); 
serverSocket.bind(socketAddress); 
serverSocket.accept(); 

Si leo dirección local de InetAddress.getLocalHost(), otros usuarios de la red en la misma subred son todavía capaces de ver mi servidor.

Mohsen.

+0

D'oh, sí, olvidé que 'InetAddess.getLocalHost()' no le da 127.0.0.1, le da la dirección IP externa de ese host local. Mi error. – skaffman

+0

Sí, he encontrado que InetAddress.getLocalHost() tampoco funciona como se esperaba. – spender

+1

Tenga en cuenta que "estoy escuchando en 127.0.0.1 para que solo los usuarios locales me puedan conectar" la suposición a veces falla, por ejemplo, si tiene un proxy ejecutándose en su máquina que puede ser forzado a conectarse a 127.0.0.1 en nombre de un usuario remoto. – caf

11

InetAddress.getByName (null) siempre devuelve la dirección de bucle invertido. Ver el javadoc

int port = ..... 
    SocketAddress socketAddress = 
     new InetSocketAddress(InetAddress.getByName(null), port); 
    ServerSocket serverSocket = new ServerSocket(); 
    serverSocket.bind(socketAddress); 
    serverSocket.accept(); 
+0

Bueno. Ojalá hubiera sabido esto hace un tiempo. Me puse terriblemente confundido. – spender

+3

Este es uno de los peores ejemplos de arrastre de características. Proporcionar 'InetAddress.getLoopbackAddress()' sería mucho más limpio. Descubrí esto simplemente por incidente. La cadena de direcciones en mi aplicación se anuló bajo alguna condición y en lugar de NPE, mi aplicación aún funciona sola. Esto ha sido una lección valiosa para leer la API de Java cuidadosamente y con toda la atención. –

+0

@AlexanderPogrebnyak, pregunta tonta ... ¿qué pasa con [InetAddress.isLoopbackAddress()] (http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#isLoopbackAddress--)? – Gili

Cuestiones relacionadas