2008-09-19 24 views
8

Tôi có một ứng dụng java (không chạy trong bất kỳ vùng chứa ứng dụng nào) mà lắng nghe trên một ServerSocket cho các kết nối. Tôi muốn nó chỉ chấp nhận các kết nối đến từ localhost. Hiện tại, sau khi kết nối được chấp nhận, nó kiểm tra IP ngang hàng và từ chối nó nếu nó không phải là địa chỉ loopback, nhưng tôi biết rằng các địa chỉ IP ngang hàng có thể bị giả mạo. Vì vậy, nếu có thể, tôi muốn liên kết với một socket chỉ lắng nghe trên giao diện loopback; điều này có thể không?Làm cách nào để có một socket chỉ chấp nhận các kết nối từ localhost (trong Java)?

Tôi đã thử một vài thứ khác nhau (chẳng hạn như chỉ định "127.0.0.1" làm địa chỉ cục bộ khi gọi hàm bind()) không có may mắn. Cảm ơn trước.


Cảm ơn tất cả sự giúp đỡ của bạn. Tôi xấu hổ khi thừa nhận rằng đây là tất cả những sai lầm của tôi. Ứng dụng của chúng tôi lắng nghe trên hai cổng khác nhau và tôi đã liên kết một cổng với giao diện loopback nhưng thử nghiệm với giao diện kia. Khi tôi thực sự cố gắng telnet đến cổng chính xác, mọi thứ hoạt động tốt (tức là, ràng buộc với "127.0.0.1" thực hiện chính xác những gì nó được cho là).

Để giả mạo địa chỉ lặp lại, các bạn đã đúng. Tôi không nên làm cho nó nghe như mối quan tâm chính. Thực sự, hành vi mong muốn là chỉ lấy các kết nối cục bộ và ràng buộc với giao diện cục bộ là cách trực tiếp hơn để đạt được điều đó hơn là chấp nhận tất cả các kết nối và sau đó đóng các kết nối không phải cục bộ.

+0

Bạn lấy thông tin 127.0.0.1 ở đâu? Tôi hoài nghi. –

Trả lời

7

Không thể giả mạo địa chỉ IP ngang hàng theo cách này, bạn không có gì phải lo sợ khi sử dụng kỹ thuật kiểm tra ngang hàng và quyết định xóa kết nối trong khi thiết lập.

Tuy nhiên: liên kết đến 127.0.0.1 sẽ hoạt động và khiến hệ điều hành thông báo cho máy chủ kết nối rằng không có gì nghe nếu chúng kết nối trên một trong các hệ thống địa chỉ IP khác. Bạn có thể sửa đổi câu hỏi này bằng một ví dụ có thể biên dịch được không? Có lẽ bạn đã thực hiện một lỗi đơn giản.

1

Khi bạn ràng buộc ServerSocket, chỉ định localhost sẽ làm cho ngăn xếp TCP/IP từ chối kết nối. Ngay cả khi điều này không làm việc trên hệ thống của bạn, localhost không thể (okay, có thể nếu ai đó tấn công ngăn xếp TCP/IP của bạn và bộ định tuyến cổng mặc định) bị giả mạo, vì địa chỉ đó không được định tuyến thông qua giao diện vật lý.

Tôi tò mò là tại sao ràng buộc của bạn không thành công, hệ điều hành của bạn, phiên bản Java, v.v. là gì?

3

Bạn có thể, như bạn đã có vẻ đang làm, chấp nhận() các kết nối anyway sau đó sử dụng getInetAddress() để đảm bảo địa chỉ là một ủy quyền. Nếu không, chỉ cần đóng() ổ cắm ngay lập tức. 127.0.0.1không phải một địa chỉ có thể bị giả mạo.

Ngoài ra, bạn có thể cài đặt trình quản lý bảo mật của riêng mình sẽ có phương thức checkAccept() được gọi với địa chỉ và cổng của trang từ xa. Thet khó hơn một chút - tôi chưa bao giờ thử kể từ khi giải pháp đầu tiên luôn phù hợp với tôi.

+1

Các poster ban đầu đã nói rằng ông đang làm điều đó, nhưng không muốn vì phía từ xa có thể được 'giả mạo' hoặc một cái gì đó. – Jerub

+1

Jerub: OP không hiểu giả mạo. Pax: Bất kỳ trình quản lý bảo mật cũ nào cũng sẽ làm, bạn chỉ cần đặt chính sách cấp mã cho đúng quyền (cho phép java.net.SocketPermission "127.0.0.1" "nghe, chấp nhận" hoặc một cái gì đó tương tự - cần phải nắm bắt SecurityException từ chấp nhận). –

3

Nếu địa chỉ ngang hàng bị giả mạo, thì bạn không thể làm gì thêm.

Tuy nhiên, giả mạo 127.0.0.1 không dễ dàng. Bạn sẽ phải có một ngăn xếp TCP/IP đủ ngu ngốc để chấp nhận một gói như vậy. Sẽ không có cách nào của chiếc loa nhận lại các gói tin. Trên một ngăn xếp TCP/IP tốt, nó không thể đoán số thứ tự để nó không thể theo kịp với cuộc hội thoại dự kiến.

2
if (socket.getInetAddress().isLoopbackAddress()){ 
    //Your code goes here 
} 
+0

Mặc dù mã thể hiện chính nó, nhưng các câu trả lời chỉ có mã không được khuyến khích. Xem xét thêm tài liệu tham khảo tài liệu, những gì nó làm và như vậy. – edmz

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