मैं जेवीएम कक्षाओं को लोड करने के लिए कहा जाता है जब मैं सुरक्षा मॉडल को समझने की कोशिश कर रहा हूँ।जावा क्लासलोडर सुरक्षा मॉडल
सैंडबॉक्सिंग पर जेवीएम विनिर्देश से, मुझे विश्वास है कि मानक जेवीएम कार्यान्वयन को primordial ClassLoader
से स्वतंत्र, कम से कम एक अन्य ClassLoader
बनाए रखना चाहिए। इसका उपयोग एप्लिकेशन क्लास फ़ाइलों को लोड करने के लिए किया जाता है (उदाहरण के लिए प्रदत्त क्लासपाथ से)।
वर्ग ClassLoader
कि नहीं है से अनुरोध किया जाता है तो यह नाम स्थान, java/lang/String
उदाहरण के लिए, तो यह मौलिक ClassLoader
करने के लिए अनुरोध है, जो जावा एपीआई से वर्ग को लोड करने का प्रयास करता है तो यह अग्रेषित करता है, अगर इसकी वहाँ नहीं है में NoClassDefFoundError
फेंकता है।
क्या मैं सोच रहा हूं कि प्राइमोरियल ClassLoader
केवल जावा एपीआई नेमस्पेस से कक्षाएं लोड करता है, और अन्य सभी वर्ग अलग ClassLoader
कार्यान्वयन के माध्यम से लोड किए जाते हैं?
और क्योंकि इसका मतलब है कि एक दुर्भावनापूर्ण वर्ग जावा एपीआई के एक सदस्य का छद्मवेष नहीं कर सकता यह अधिक सुरक्षित वर्गों में से लोड हो रहा है कि बनाता है (देता है java/lang/Virus
कहते हैं) क्योंकि यह एक संरक्षित नाम स्थान है, और वर्तमान ClassLoader
में नहीं किया जा सकता ?
लेकिन जावा एपीआई की कक्षाओं को दुर्भावनापूर्ण वर्गों द्वारा प्रतिस्थापित करने के लिए कुछ भी है, या यह class
सत्यापन के दौरान पता लगाया जाएगा?
असल में सही। "प्राइमोरियल" क्लासलोडर को "बूट क्लासलोडर" के रूप में जाना जाता है और "बूट क्लासपाथ" से कक्षाएं लोड करता है। इस द्वारा प्रदान की गई सुरक्षा उचित रूप से "मजबूत" है क्योंकि "सुरक्षा अधिकारी" JVM आमंत्रण (उदाहरण के लिए, कमांड लाइन) को नियंत्रित करता है जहां बूट क्लासपाथ निर्दिष्ट होता है। –
(कुछ जेवीएम के पास बूट क्लासपाथ पर अतिरिक्त सुरक्षा है, जिसके लिए जारों के पास एक विशेषाधिकार प्राप्त विशेषता है।) –
@HotLicks 'बूट क्लासपाथ' जहां जावा रनटाइम स्थित है? – Jivings