2009-10-09 2 views
8

들어오는 연결을 수락하는 SocketServer가 있습니다. 보안상의 이유로 로컬 연결 (서버가 실행중인 시스템의 연결) 만 허용해야합니다.들어오는 연결을 확인하는 방법은 로컬 컴퓨터에서입니다.

들어오는 연결이 다른 컴퓨터에서 오는 것인지 어떻게 확인할 수 있습니까? 이 코드는 안전합니까?

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

fromThisMachine() 방법이 같다 동안 :

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

감사합니다, 모센

답변

7

당신이 다음 지정, 로컬 호스트에서 연결을 제한하려는 경우에는 ServerSocket의를 열 때. localhost에서만 수신하면 localhost에서만 연결을 받게됩니다.

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

참고 : 작동하지 않습니다. 참조 : 나는 192.168.0.1에 있고 다른 사람은 192.168.0.2에 있습니다. 192.168.0.1:port에서 수신하는 서버 소켓에 대한 액세스를 거부하려고하지만이 솔루션이 작동하지 않습니다. 127.0.0.1:port에 연결하면 내 컴퓨터에서만 작동하지 않습니다. – Mohsen

+1

이것은 질문의 anwer가 아닙니다. 잘못 표시된 이유는 무엇입니까? 이 경우에는 다른 문제도 발생합니다. 같은 문제가 떠오르는 다른 모든 사람들에게는 공개되지 않고 답을해야합니다. – Lothar

3

감사합니다. 다음 코드는 조금 조작하여 작업했습니다 (하드 코딩 127.0.0.1). 내가 InetAddress.getLocalHost()에서 로컬 주소를 읽으면

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

는 동일한 서브넷에 다른 네트워크 사용자는 내 서버를 볼 수 있습니다.

모센.

+0

D' oh, 예, InetAddess.getLocalHost()가 127.0.0.1을 제공하지 않는다는 사실을 잊었습니다. 로컬 호스트의 외부 IP 주소를 제공합니다. 내 잘못이야. – skaffman

+0

예, InetAddress.getLocalHost()가 예상대로 작동하지 않는다는 것을 발견했습니다. – spender

+1

"로컬 사용자 만 내게 연결할 수 있으므로 127.0.0.1에서 듣고 있습니다"라는 가정에 따라 때때로 가끔씩 오류가 발생합니다. 예를 들어 컴퓨터에서 실행중인 프록시가 127.0.0.1 대신에 연결될 수있는 경우 원격 사용자. – caf

11

InetAddress.getByName (null)은 항상 루프백 주소를 반환합니다. javadoc

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

좋은 친구. 내가 이것을 잠시 알았 더라면 좋겠다. 나는 끔찍하게 혼란스러워했다. – spender

+3

이것은 기능 크리프의 최악의 예 중 하나입니다. 'InetAddress.getLoopbackAddress()'를 제공하면 훨씬 더 깨끗합니다. 나는 이것을 사건으로 간단히 발견했다. 내 응용 프로그램의 주소 문자열은 일부 조건에서 제외되었으며 NPE 대신 내 응용 프로그램은 여전히 ​​혼자 힘들어했습니다. 이는 Java API를주의 깊게 읽고주의 깊게 읽는 것이 중요합니다. –

+0

@AlexanderPogrebnyak, 바보 같은 질문 ... [InetAddress.isLoopbackAddress()] (http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#isLoopbackAddress--)는 어떨까요? – Gili

관련 문제