2009-10-09 37 views
8

Tôi có một SocketServer chấp nhận các kết nối đến. Vì lý do bảo mật, tôi chỉ nên cho phép các kết nối cục bộ (các kết nối từ máy mà máy chủ đang chạy).Cách xác định kết nối đến từ máy cục bộ

Làm cách nào để xác định liệu kết nối đến có đến từ một máy khác không? Mã sau có an toàn cho điều này không?

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

khi fromThisMachine() phương pháp là như thế này:

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

Cảm ơn, Mohsen

Trả lời

7

Nếu bạn muốn giới hạn các kết nối từ localhost, sau đó xác định rằng khi bạn mở ServerSocket. Nếu bạn chỉ nghe trên localhost, thì bạn sẽ chỉ nhận được các kết nối từ localhost.

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

Nó không hoạt động. Xem: Tôi đang ở trên 192.168.0.1 và một người khác trên 192.168.0.2. Tôi muốn từ chối truy cập của mình vào ổ cắm máy chủ của tôi nghe trên 192.168.0.1:port, nhưng giải pháp này không hoạt động. Nó chỉ gây ra rằng kết nối đến 127.0.0.1:port không hoạt động từ máy tính của riêng tôi. – Mohsen

+1

Đây không phải là một anwer cho câu hỏi. Tại sao nó được đánh dấu không chính xác. Các anwers khác cũng sai trong trường hợp này nó nên được mở và không trả lời cho tất cả những người khác đến với cùng một vấn đề. – Lothar

3

Cảm ơn skaffman. Đoạn mã sau đã làm việc với một thao tác nhỏ (mã hóa cứng 127.0.0.1).

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

Nếu tôi đọc địa chỉ cục bộ từ InetAddress.getLocalHost(), người dùng mạng khác trên cùng một mạng con vẫn có thể xem máy chủ của tôi.

Mohsen.

+0

D'oh, vâng, tôi quên rằng 'InetAddess.getLocalHost()' không cung cấp cho bạn 127.0.0.1, nó cung cấp địa chỉ IP bên ngoài của máy chủ cục bộ đó. Lỗi của tôi. – skaffman

+0

Có, tôi đã tìm thấy InetAddress.getLocalHost() không thực sự hoạt động như mong đợi. – spender

+1

Được cảnh báo rằng "Tôi đang nghe 127.0.0.1 để chỉ người dùng cục bộ mới có thể kết nối với tôi" giả định đôi khi không thành công - ví dụ: nếu bạn có proxy chạy trên máy có thể bị ép buộc kết nối với 127.0.0.1 thay mặt người dùng từ xa. – caf

11

InetAddress.getByName (null) luôn trả về địa chỉ vòng lặp. Xem javadoc

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

Đẹp nhất. Ước gì tôi biết điều này một lúc trở lại. Tôi vô cùng bối rối. – spender

+3

Đây là một trong những ví dụ tồi tệ nhất về tính năng creep. Việc cung cấp 'InetAddress.getLoopbackAddress()' sẽ sạch hơn rất nhiều. Tôi phát hiện ra điều này chỉ đơn giản bằng sự cố. Chuỗi địa chỉ trong ứng dụng của tôi đã bị vô hiệu theo một số điều kiện và thay vì NPE, ứng dụng của tôi vẫn còn chugged một mình. Điều này đã dạy là một bài học có giá trị để đọc Java API một cách cẩn thận và chú ý đầy đủ. –

+0

@AlexanderPogrebnyak, câu hỏi ngớ ngẩn ... về [InetAddress.isLoopbackAddress()] (http://docs.oracle.com/javase/8/docs/api/java/net/InetAddress.html#isLoopbackAddress--)? – Gili

Các vấn đề liên quan