2009-10-09 15 views
8

着信接続を受け入れるSocketServerがあります。セキュリティ上の理由から、ローカル接続(サーバーが稼働しているマシンからの接続)のみを許可する必要があります。着信接続を確認する方法はローカルマシンからです

着信接続が別のマシンからのものかどうかを確認するにはどうすればよいですか?次のコードは安全ですか?

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

fromThisMachine()方法は次のようである間:あなたはServerSocketのを開くとことを指定した後、ローカルホストからの接続を制限する場合

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

。 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

これは疑問のアンカーではありません。なぜそれは間違ってマークされます。この場合、他のアンワースも間違っています。同じ問題を抱える他のすべての人々にとっては未解決のままにすべきです。 – 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(); 

は、同じサブネット上の他のネットワークユーザーが自分のサーバーを参照することができます。

Mohsen。

+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

これは、機能クリープの最悪の例の1つです。 'InetAddress.getLoopbackAddress()'を提供する方がずっときれいです。私は事件によってこれを簡単に発見しました。私のアプリケーションのアドレス文字列は何らかの条件の下でヌルになってしまい、NPEの代わりに私のアプリケーションはまだ単独で悩まされていました。これは、Java APIを慎重かつ十分に読んでいく上での貴重な教訓です。 –

+0

@AlexanderPogrebnyak、愚かな質問... [InetAddress.isLoopbackAddress()]について(http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#isLoopbackAddress--) – Gili

関連する問題