2009-10-09 32 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說。如果你只在本地主機上監聽,那麼你只能從本地主機獲得連接。

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 2009-10-09 08:30:38

+1

這不是問題的重點。爲什麼它被錯誤標記。其他情況也是錯誤的,在這種情況下,應該讓所有其他提出同樣問題的人保持開放並且沒有答案。 – Lothar 2015-12-07 01:31:48

3

謝謝skaffman。下面的代碼使用一點操作(硬編碼127.0.0.1)。

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

如果我從InetAddress.getLocalHost()讀取本地地址,在同一子網的其他網絡用戶仍然能夠看到我的服務器。

Mohsen。

+0

噢,是的,我忘了'InetAddess.getLocalHost()'不給你127.0.0.1,它給出了本地主機的外部IP地址。我的錯。 – skaffman 2009-10-09 09:00:03

+0

是的,我發現InetAddress.getLocalHost()並不像預期的那樣工作。 – spender 2009-10-09 09:02:06

+1

被警告說「我在127.0.0.1上偵聽,因此只有本地用戶可以連接到我」假設有時會失敗 - 例如,如果您的計算機上運行代理,可以強制代表連接到127.0.0.1遠程用戶。 – caf 2009-10-10 12:07:35

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 2009-10-10 14:27:49

+3

這是蠕變特徵最糟糕的例子之一。提供'InetAddress.getLoopbackAddress()'將會非常乾淨。我僅僅通過事件發現了這一點。我的應用程序中的地址字符串在某些情況下被拒絕,而不是NPE,我的應用程序仍然獨自一人。這被認爲是仔細閱讀Java API並充分關注的有價值的教訓。 – 2009-10-12 15:01:54

+0

@AlexanderPogrebnyak,愚蠢的問題... [InetAddress.isLoopbackAddress()](http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#isLoopbackAddress--)呢? – Gili 2014-07-07 19:31:59

相關問題