Как определить входящее соединение с локальной машины - PullRequest
8 голосов
/ 09 октября 2009

У меня есть 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;
}

Спасибо, Мохсен

Ответы [ 3 ]

11 голосов
/ 09 октября 2009

InetAddress.getByName (null) всегда возвращает адрес обратной связи. См. Javadoc

    int port = .....
    SocketAddress socketAddress =
        new InetSocketAddress( InetAddress.getByName( null ), port);
    ServerSocket serverSocket = new ServerSocket();
    serverSocket.bind(socketAddress);
    serverSocket.accept();
7 голосов
/ 09 октября 2009

Если вы хотите ограничить соединения с локального хоста, укажите это при открытии ServerSocket. Если вы слушаете только localhost, вы будете получать соединения только с localhost.

    int port = .....
    SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
    ServerSocket serverSocket = new ServerSocket();
    serverSocket.bind(socketAddress);
    serverSocket.accept();
3 голосов
/ 09 октября 2009

Спасибо скаффман. Следующий код работал с небольшими манипуляциями (жесткое кодирование 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 (), другие пользователи сети в той же подсети все еще могут видеть мой сервер.

Мохсен.

...