2008-09-19 13 views
8

मेरे पास एक जावा ऐप है (किसी भी एप्लिकेशन कंटेनर में नहीं चल रहा है) जो कनेक्शन के लिए सर्वर सॉकेट पर सुनता है। मैं इसे केवल स्थानीयहोस्ट से आने वाले कनेक्शन स्वीकार करना चाहता हूं। वर्तमान में, कनेक्शन स्वीकार करने के बाद, यह सहकर्मी आईपी की जांच करता है और यदि यह लूपबैक पता नहीं है तो इसे अस्वीकार कर देता है, लेकिन मुझे पता है कि सहकर्मी आईपी पते को धोखा दिया जा सकता है। इसलिए, यदि संभव हो, तो मैं एक सॉकेट से जुड़ना पसंद करूंगा जो केवल लूपबैक इंटरफ़ेस पर सुनता है; क्या यह संभव है?मेरे पास केवल स्थानीयहोस्ट (जावा में) से सॉकेट स्वीकृति कनेक्शन कैसे हो सकता है?

मैंने कुछ अलग-अलग चीजों की कोशिश की है (जैसे कि "127.0.0.1" को स्थानीय पते के रूप में निर्दिष्ट करते समय बाध्य() को कॉल करते समय बाध्य()) निर्दिष्ट करते हैं। अग्रिम में धन्यवाद।


आप सभी आपकी मदद के लिए धन्यवाद। मुझे यह स्वीकार करने में शर्मिंदा है कि यह मेरी सारी गलती थी। हमारा आवेदन दो अलग-अलग बंदरगाहों पर सुनता है, और मैं लूपबैक इंटरफेस में बाध्यकारी था लेकिन दूसरे के खिलाफ परीक्षण कर रहा था। जब मैं वास्तव में सही बंदरगाह पर टेलनेट करने की कोशिश करता हूं, तो सबकुछ ठीक काम करता है (यानी, "127.0.0.1" को बाध्यकारी करना ठीक वही करता है जो इसे माना जाता है)।

लूपबैक पते को धोखा देने के लिए, आप लोग सही हैं। मुझे इसे प्राथमिक चिंता की तरह नहीं बनाया जाना चाहिए था। असल में, वांछित व्यवहार केवल स्थानीय कनेक्शन लेना है, और केवल स्थानीय इंटरफेस के लिए बाध्यकारी सभी कनेक्शन स्वीकार करने और फिर गैर-स्थानीय लोगों को बंद करने से प्राप्त करने का एक और सीधा तरीका है।

+0

आपको यह जानकारी मिली कि 127.0.0.1 को धोखा दिया जा सकता है? मैं उलझन में हूँ। –

उत्तर

7

पीयर आईपी पते को इस तरह से धोखा नहीं दिया जा सकता है, क्या आप सहकर्मी की जांच करने और स्थापना के दौरान कनेक्शन छोड़ने की तकनीक का उपयोग करने से डरने के लिए कुछ भी नहीं है।

हालांकि: 127.0.0.1 को बाध्यकारी काम करना चाहिए, और ऑपरेटिंग सिस्टम को कनेक्टिंग होस्ट को बताने का कारण बनता है कि अगर वे किसी अन्य सिस्टम में किसी अन्य सिस्टम से कनेक्ट नहीं होते हैं तो कुछ भी नहीं सुन रहा है। क्या आप इस प्रश्न को एक संगत उदाहरण के साथ संशोधित कर सकते हैं? शायद आपने एक साधारण त्रुटि की है।

1

जब आप अपना सर्वर सॉकेट बांधते हैं, तो स्थानीयहोस्ट निर्दिष्ट करने से टीसीपी/आईपी स्टैक कनेक्शन को अस्वीकार कर देना चाहिए। यहां तक ​​कि यदि यह आपके सिस्टम पर काम नहीं कर रहा है, तो स्थानीयहोस्ट नहीं कर सकता (ठीक है, हो सकता है कि अगर कोई आपके टीसीपी/आईपी स्टैक और डिफ़ॉल्ट गेटवे राउटर को हैक कर रहा हो) धोखा दिया जाए, क्योंकि उस पते को भौतिक इंटरफेस के माध्यम से नहीं भेजा जाता है।

मुझे उत्सुकता है कि क्यों आपका बाध्यकारी सफल नहीं होता है, आपका ओएस, जावा संस्करण आदि क्या है?

3

जैसा कि आप पहले से ही ऐसा कर रहे हैं, स्वीकार कर सकते हैं, कनेक्शन को स्वीकार कर सकते हैं, फिर getInetAddress() का उपयोग यह सुनिश्चित करने के लिए कि पता एक अधिकृत है। यदि नहीं, तो सॉकेट को तुरंत बंद करें()। 127.0.0.1 एक पता है जिसे धोखा दिया जा सकता है।

वैकल्पिक रूप से, आप अपना खुद का सुरक्षा प्रबंधक स्थापित कर सकते हैं जिसमें रिमोट साइट के पते और बंदरगाह के साथ इसकी चेकएसेप्ट() विधि होगी। यह थोड़ा कठिन है - मैंने कभी कोशिश नहीं की है क्योंकि पहला समाधान हमेशा मेरे लिए पर्याप्त रहा है।

+1

मूल पोस्टर ने पहले ही कहा है कि वह ऐसा कर रहा है, लेकिन ऐसा नहीं करना चाहता क्योंकि रिमोट साइड 'स्पूफेड' या कुछ हो सकता है। – Jerub

+1

जेरुब: ओपी स्पूफिंग को समझ में नहीं आता है। पैक्स: कोई भी पुराना सुरक्षा प्रबंधक करेगा, आपको केवल कोड को सही अनुमति देने की अनुमति देने की आवश्यकता है (अनुमति java.net.SocketPermission "127.0.0.1" "सुनो, स्वीकार करें", या ऐसा कुछ - सुरक्षा अपवाद को पकड़ने की आवश्यकता है स्वीकार करने से)। –

3

यदि सहकर्मी पता धोखा दिया गया है, तो आप कुछ भी नहीं कर सकते हैं।

हालांकि, 127.0.0.1 को धोखा देना आसान नहीं है। आपको ऐसे पैकेट को स्वीकार करने के लिए पर्याप्त टीसीपी/आईपी स्टैक गूंगा होना होगा। स्पूफर प्राप्त करने वाले पैकेट का कोई तरीका नहीं होगा। एक अच्छे टीसीपी/आईपी स्टैक पर, यह अनुक्रम संख्या अनुमान लगाने में सक्षम नहीं होना चाहिए, इसलिए यह अपेक्षित वार्तालाप के साथ नहीं रह सकता है।

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

हालांकि कोड स्वयं अभिव्यक्त करता है, कोड-केवल उत्तर निराश होते हैं। दस्तावेज़ीकरण संदर्भ जोड़ने पर विचार करें, यह क्या करता है और इसी तरह। – edmz

संबंधित मुद्दे