2010-01-13 6 views
7

से मूल कोड कार्यक्षमता प्रतिबंधित करें मेरे पास एक जावा एप्लिकेशन है जो कुछ हिस्सों में जेएनआई का उपयोग कुछ काम करने के लिए करता है। यह डीएलएल की सामान्य लोडिंग का पालन करता है और फिर डीएलएल के मूल तरीकों को बुलाता है। क्या कोई तरीका है कि हम जावा एप्लिकेशन से कौन सी मूल विधियां कर सकते हैं प्रतिबंधित कर सकते हैं? उदाहरण के लिए, क्या हम डीएलएल को किसी भी फाइल को खोलने या किसी भी सॉकेट को नहीं खोलने के लिए प्रतिबंधित कर सकते हैं भले ही उसके पास कोड है? यह सिर्फ कुछ चीजों को करने के लिए लोड होने वाले डीएलएल को रोक सकता है, कुछ लॉग इन करके या अपवाद फेंक सकता है।जावा

+0

दिलचस्प सवाल है, लेकिन आप जो भी करने की कोशिश कर रहे हैं उसके बारे में और जानना बहुत अच्छा होगा। क्या आप अपने जावा एप्लिकेशन में तीसरे पक्ष के डीएलएल लोड करने की अनुमति देने की कोशिश कर रहे हैं, लेकिन डरते हैं कि वे इसे हैक कर सकते हैं? यह एक बहुत ही वास्तविक खतरा है। एक डीएलएल जावा मशीन में तोड़ सकता है और इससे सबकुछ प्राप्त कर सकता है। –

+1

@Clark: बिल्कुल। हम तीसरे पक्ष नहीं कह सकते हैं। लेकिन मान लें कि हमारे पास जावा ऐप है। और हम एक ढांचे को परिभाषित करते हैं जिसका उपयोग करके कोई भी डीएलएल विकसित कर सकता है और इसे हमारे ऐप के साथ उपयोग कर सकता है। और मैं ढांचे से क्या प्राप्त कर सकता हूं इसे प्रतिबंधित करना चाहता हूं। मुझे आशा है कि आपको तस्वीर मिल जाएगी। – vpram86

उत्तर

7

मुझे Gregory Pakosz 'answer बहुत पसंद आया। हालांकि, आप जावा इंस्टेंस स्वयं ही सैंडबॉक्स कर सकते हैं। जावा एप्लिकेशन को प्रतिबंधित संदर्भ में स्वयं शुरू करें।

विंडोज या यूनिक्स में आप एक ऐसे उपयोगकर्ता को बना सकते हैं जो किसी निश्चित निर्देशिका तक सीमित हो और केवल कुछ डीएलएल तक पहुंच हो। इस प्रकार जेएनआई से बुलाया गया डीएलएल जो कुछ भी चाहता है वह कर सकता है, लेकिन यह बहुत दूर नहीं होगा, क्योंकि जावा जितना उपयोगकर्ता चलता है उतना ज्यादा नहीं कर सकता है।

यदि आपके जावा प्रोग्राम को विशेषाधिकार प्राप्त करने की आवश्यकता है, तो इसके जावा पक्ष को इसके लिए विशेषाधिकार प्राप्त करने के लिए किसी अन्य प्रोग्राम (जावा या नहीं) से बात करनी होगी।

बस ध्यान रखें, कि यदि आप डीएलएल पर भरोसा नहीं कर सकते हैं, तो आप जावा कोड पर भरोसा नहीं कर सकते हैं, क्योंकि डीएलएल ने जावा मशीन को "हैक किया" हो सकता है। दूसरी तरफ, उपयोगकर्ता के द्वारा चलाए जाने वाले उपयोगकर्ता की सीमाओं से कोई भी बुरा सामान तोड़ने में सक्षम नहीं होना चाहिए। (ओएस पर गलत कॉन्फ़िगरेशन या बग को छोड़कर।)

+1

+1 - कुछ इसी तरह लिखने वाला था।केवल एक चीज जो मैं जोड़ूंगा वह यह है कि डीएलएल को जावा एप्लिकेशन से एक्सेस की जाने वाली किसी भी प्रकार की सेवा परत में लपेटना उपयोगी हो सकता है। लेकिन यह अस्वीकार्य ओवरहेड पेश कर सकता है। – kdgregory

+0

अच्छा सुझाव। बहुत क्लार्क और ग्रेगरी धन्यवाद! – vpram86

1

आम तौर पर आप जावा सुरक्षा प्रबंधक के तहत अपना आवेदन चलाएंगे लेकिन मुझे विश्वास नहीं है कि जेएनआई के माध्यम से कोड पर इसका कोई प्रभाव पड़ता है।

+0

धन्यवाद। मैं सोच रहा था कि क्या हम डीएलएल लोडिंग के संबंध में सुरक्षा प्रबंधक में कुछ गुणों को सेट करके कम से कम फ़ाइल निर्माण या हटाना प्रतिबंधित कर सकते हैं। – vpram86

8

नहीं, आप नहीं कर सकते। डीएलएल पूरी तरह से लोड हो जाता है और फिर जावा पक्ष का मूल कोड क्या कर रहा है पर कोई नियंत्रण नहीं है।

एक समाधान मध्य दृष्टिकोण में एक प्रकार का आदमी हो सकता है। इसमें एक "खोल" डीएलएल कोडिंग शामिल होगा जिसमें मूल डीएलएल के समान इंटरफ़ेस होगा। आप जावा को एक "खोल" डीएलएल लोड करने के लिए कहते हैं उदाहरण के लिए इसे किसी विशिष्ट स्थान पर रखकर और java.library.path संपत्ति का उपयोग करके। फिर "खोल" डीएलएल की भूमिका "सच्चे" डीएलएल को सैंडबॉक्सिंग करके और मानक कार्यों को पुनर्निर्देशित करके लोड करना है। यह बहुत दर्द और ऐसा कुछ है जो चीजों पर देशी पक्ष में होता है, जावा से नहीं।

+0

धन्यवाद। मैं समझता हूँ कि। क्या कोई रास्ता नहीं है जिसके द्वारा हम जावा प्रक्रिया को इसे सीमित प्रकार की संपत्ति के साथ लोड करने के लिए कह सकते हैं? – vpram86

+0

वाह! बहुत बहुत धन्यवाद। लेकिन यह मूल डीएलएल के लिए खोल से जुड़ा हुआ है और यदि हमारे पास कई डीएलएल हैं तो हमें शेल डीएलएल को भी correponding करने की आवश्यकता हो सकती है :(जैसा कि आपने कहा है वास्तव में भारी है। मैं सोच रहा था कि लोडिंग या JVM स्टार्टअप के दौरान कुछ संपत्ति के माध्यम से यह संभव है या नहीं तर्क देता है। लेकिन अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद। – vpram86

1

आप किसी भी प्रकार की सेटिंग को कार्यान्वित कर सकते हैं जो आपका जेएनआई कोड प्राप्त कर सकता है। उदाहरण के लिए, यूनिक्स सिस्टम पर, आप विशेष प्रकार के विशेषाधिकारों के लिए समूह बना सकते हैं, और जांच सकते हैं कि वर्तमान उपयोगकर्ता के पास आवश्यक विशेषाधिकार हैं या नहीं, तो बस 0 या कुछ लौटाएं।

+0

बिल्कुल। बहुत बहुत धन्यवाद!। यह वह था जिस पर क्लार्क के जवाब में चर्चा हुई थी। हम यूनिक्स में भी इसका इस्तेमाल कर सकते थे। – vpram86