2014-09-13 13 views
5

में विशेषाधिकारित ब्लॉक की आवश्यकता क्या है मैंने विशेषाधिकार ब्लॉक के भीतर निष्पादित प्रतिबिंब के माध्यम से फ़ील्ड मान प्राप्त करने के लिए कोड देखा है। कोड का टुकड़ा के बाद ReflectionUtil से लिया जाता है:प्रतिबिंब

public static <T> T accessDeclaredField(final Field f, final Object o, final Class<T> responseClass) { 
    return AccessController.doPrivileged(new PrivilegedAction<T>() { 
     public T run() { 
      boolean b = f.isAccessible(); 
      try { 
       f.setAccessible(true); 
       return responseClass.cast(f.get(o)); 
      } catch (SecurityException e) { 
       return null; 
      } catch (IllegalAccessException e) { 
       return null; 
      } finally { 
       f.setAccessible(b); 
      } 
     } 
    }); 
} 

मैं विशेषाधिकार प्राप्त ब्लॉक के भीतर क्षेत्र मूल्य प्राप्त करने के कारण समझ में नहीं आता; हम इसके बिना इसे कर सकते हैं।

क्या यह बेहतर कोडिंग अभ्यास है या क्या हमें कुछ अतिरिक्त लाभ मिलता है?

रेफरी: API for Privileged Blocks

+1

एक अप्रत्याशित साइड नोट के रूप में: यदि किसी की सुरक्षा सेटिंग्स विश्वसनीय कोड और कुछ अविश्वसनीय कोड के रूप में सीएक्सएफ लोड करती है, तो अविश्वसनीय कोड जावा सैंडबॉक्स से बचने के लिए (केवल सही 'पैरामीटर के साथ' सार्वजनिक स्थिर 'विधि को कॉल करके) अविश्वसनीय कोड कर सकता है। पाठक को एक अभ्यास के रूप में कौन सा पैरामीटर छोड़ा गया है। सबक सीखा: कभी भी ** सार्वजनिक ** विधि में डुबकी का उपयोग न करें जहां कॉलर सभी प्रासंगिक मानकों को नियंत्रित कर सकता है ... – mihi

+2

@mihi आपकी टिप्पणी कई लोगों को सिखाएगी अगर यह पहेली के मुख्य भाग को बाहर नहीं छोड़ती पाठक के लिए व्यायाम। ज्यादातर लोगों के लिए "कोई सबक नहीं सीखा" होगा। अधिकांश लोगों के लिए –

+0

@MarkoTopolnik यह जानने के लिए पर्याप्त है कि आप किसी भी निजी क्षेत्र में लिख सकते हैं, और यह एक सुरक्षा समस्या है। सुरक्षा प्रबंधक को तोड़ने के लिए लिखने वाले लोगों को ढूंढना मुश्किल नहीं है। प्रेरणा के लिए: https://github.com/schierlm/JavaPayload/blob/master/JavaPayload/src/javapayload/escalate/EscalateBasics.java#L58 – mihi

उत्तर

6

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

2

हां आपको कॉलिंग क्लास की अनुमतियों के साथ PrivilegedAction पर कॉल करने का लाभ प्राप्त होता है, भले ही कोड (इस मामले में विधि accessDeclaredField) को बाहरी कोड द्वारा बुलाया जाता है जिसमें इन अनुमतियां नहीं हैं।

AccessController.doPrivileged का उपयोग कर के बिना, फिर कुछ कोड एक्स एक घोषित क्षेत्र और कोड एक्स का उपयोग करने की अनुमति सुरक्षा suppressAccessChecks तो कार्रवाई एक सुरक्षा अपवाद के साथ असफल हो जायेगी नहीं है ReflectionUtils API कॉल करता है, तो।

एक AccessController.doPrivileged, ReflectionUtils के निशान के अंदर कार्रवाई लपेटकर कि अपनी कार्रवाई भले ही बुला कोड एक्स उन अनुमति नहीं है अपने खुद अनुमति के साथ निष्पादित किया जाना चाहिए द्वारा।