如何确定传入连接来自本地计算机

Moh*_*sen 8 java sockets networking network-programming

我有一个SocketServer接受传入的连接.出于安全原因,我应该只允许本地连接(来自运行服务器的计算机的连接).

如何确定传入连接是否来自其他计算机?以下代码是否安全?

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

虽然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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢,Mohsen

Ale*_*yak 11

InetAddress.getByName(null)始终返回环回地址.请参阅javadoc

    int port = .....
    SocketAddress socketAddress =
        new InetSocketAddress( InetAddress.getByName( null ), port);
    ServerSocket serverSocket = new ServerSocket();
    serverSocket.bind(socketAddress);
    serverSocket.accept();
Run Code Online (Sandbox Code Playgroud)

  • 这是特征蠕变的最糟糕的例子之一.提供`InetAddress.getLoopbackAddress()`会更加清晰.我只是偶然发现了这件事.我的应用程序中的地址字符串在某些条件下被取消,而不是NPE,我的应用程序仍然单独使用.这已经教会了一个有价值的教训,仔细阅读Java API并充分注意. (4认同)
  • @Gili.OP的原始问题是仅接受来自localhost的连接.`isLoopbackAddress`不会帮助您获取localhost IP地址. (2认同)

ska*_*man 7

如果要限制来自localhost的连接,请在打开ServerSocket时指定.如果您只在localhost上侦听,那么您将只从localhost获取连接.

    int port = .....
    SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
    ServerSocket serverSocket = new ServerSocket();
    serverSocket.bind(socketAddress);
    serverSocket.accept();
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题的答案.为什么标记错误.在这种情况下,其他的答案也是错误的,对于提出同样问题的所有其他人,它应该保持开放和未答复. (2认同)