2012-03-11 12 views
7

मैं जेवीएम कक्षाओं को लोड करने के लिए कहा जाता है जब मैं सुरक्षा मॉडल को समझने की कोशिश कर रहा हूँ।जावा क्लासलोडर सुरक्षा मॉडल

सैंडबॉक्सिंग पर जेवीएम विनिर्देश से, मुझे विश्वास है कि मानक जेवीएम कार्यान्वयन को primordial ClassLoader से स्वतंत्र, कम से कम एक अन्य ClassLoader बनाए रखना चाहिए। इसका उपयोग एप्लिकेशन क्लास फ़ाइलों को लोड करने के लिए किया जाता है (उदाहरण के लिए प्रदत्त क्लासपाथ से)।

वर्ग ClassLoader कि नहीं है से अनुरोध किया जाता है तो यह नाम स्थान, java/lang/String उदाहरण के लिए, तो यह मौलिक ClassLoader करने के लिए अनुरोध है, जो जावा एपीआई से वर्ग को लोड करने का प्रयास करता है तो यह अग्रेषित करता है, अगर इसकी वहाँ नहीं है में NoClassDefFoundError फेंकता है।

क्या मैं सोच रहा हूं कि प्राइमोरियल ClassLoader केवल जावा एपीआई नेमस्पेस से कक्षाएं लोड करता है, और अन्य सभी वर्ग अलग ClassLoader कार्यान्वयन के माध्यम से लोड किए जाते हैं?

और क्योंकि इसका मतलब है कि एक दुर्भावनापूर्ण वर्ग जावा एपीआई के एक सदस्य का छद्मवेष नहीं कर सकता यह अधिक सुरक्षित वर्गों में से लोड हो रहा है कि बनाता है (देता है java/lang/Virus कहते हैं) क्योंकि यह एक संरक्षित नाम स्थान है, और वर्तमान ClassLoader में नहीं किया जा सकता ?

लेकिन जावा एपीआई की कक्षाओं को दुर्भावनापूर्ण वर्गों द्वारा प्रतिस्थापित करने के लिए कुछ भी है, या यह class सत्यापन के दौरान पता लगाया जाएगा?

+0

असल में सही। "प्राइमोरियल" क्लासलोडर को "बूट क्लासलोडर" के रूप में जाना जाता है और "बूट क्लासपाथ" से कक्षाएं लोड करता है। इस द्वारा प्रदान की गई सुरक्षा उचित रूप से "मजबूत" है क्योंकि "सुरक्षा अधिकारी" JVM आमंत्रण (उदाहरण के लिए, कमांड लाइन) को नियंत्रित करता है जहां बूट क्लासपाथ निर्दिष्ट होता है। –

+0

(कुछ जेवीएम के पास बूट क्लासपाथ पर अतिरिक्त सुरक्षा है, जिसके लिए जारों के पास एक विशेषाधिकार प्राप्त विशेषता है।) –

+0

@HotLicks 'बूट क्लासपाथ' जहां जावा रनटाइम स्थित है? – Jivings

उत्तर

7

ऐतिहासिक कारणों से क्लास लोडर के लिए उपयोग किए गए नाम थोड़ा असामान्य हैं। बूट क्लास लोडर सिस्टम कक्षाओं को लोड करता है। सिस्टम क्लास लोडर, डिफ़ॉल्ट रूप से, क्लास पथ से कक्षाओं को सिस्टम कक्षाओं में लोड करता है। सिस्टम क्लासेस jre/lib (ज्यादातर rt.jar में) में हैं, अनुमोदित निर्देशिकाएं और कहीं भी -Xbootclasspath के माध्यम से जोड़े गए हैं।

सूर्य/ओरेकल जेआरई पर, rt.jar में जावा के साथ शुरू होने वाले पैकेजों के साथ कक्षाएं हैं, जैवैक्स, सूरज।, Com.sun।, Org.omg, org.w3c और org.xml।

अविश्वसनीय कोड (कॉन्फ़िगरेशन समेत) सिस्टम कक्षाओं में जोड़ने में सक्षम नहीं होना चाहिए। कुछ संकुल नाम prefixed सुरक्षा संपत्ति के माध्यम से प्रतिबंधित किया जा सकता है। जावा गैर-तकनीकी कारणों के लिए उपसर्ग विशेष रूप से संरक्षित है।

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

+3

आप जेवीएम स्पेक की तरह लगते हैं। 'ऐतिहासिक कारणों से' सब कुछ के लिए उनका बहाना है;) – Jivings

+0

इसके लिए धन्यवाद, बहुत उपयोगी। – Jivings

+0

+1 "ऐतिहासिक कारणों से" – Javier

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