प्रति
secure coding
उदाहरण
खराब कोड:
final class Publisher {
public static volatile Publisher published;
int num;
Publisher(int number) {
published = this;
// Initialization
this.num = number;
// ...
}
}
एक वस्तु के प्रारंभ (और इसके परिणामस्वरूप, इसके निर्माण) निर्माता के भीतर एक सुरक्षा जांच पर निर्भर करता है, तो सुरक्षा जांच को नजरअंदाज किया जा सकता है जब एक अविश्वसनीय कॉलर आंशिक रूप से प्रारंभिक उदाहरण प्राप्त करता है। नियम OBJ11-J देखें। अधिक जानकारी के लिए रचनाकारों को अपवाद फेंकने से सावधान रहें।
final class Publisher {
public static Publisher published;
int num;
Publisher(int number) {
// Initialization
this.num = number;
// ...
published = this;
}
}
क्योंकि क्षेत्र nonvolatile और nonfinal है, निर्माता के भीतर बयान इस तरह से कि इस संदर्भ प्रारंभ बयान निष्पादित से पहले प्रकाशित किया जाता है में संकलक द्वारा पुनर्क्रमित जा सकता है।
सही कोड:
final class Publisher {
static volatile Publisher published;
int num;
Publisher(int number) {
// Initialization
this.num = number;
// ...
published = this;
}
}
इस संदर्भ में जब यह अपने मौजूदा दायरे से बाहर उपलब्ध कराया गया है बच गए कहा जाता है। बाद आम तरीके से इस संदर्भ बच सकते हैं कर रहे हैं:
Returning this from a non-private, overridable method that is invoked from the constructor of a class whose object is being
का निर्माण किया। (अधिक जानकारी के लिए, नियम MET05-J देखें। सुनिश्चित करें कि कन्स्ट्रक्टर ओवरराइड करने योग्य तरीकों को कॉल नहीं करते हैं।) इसे एक उत्परिवर्तनीय वर्ग की एक गैर-गोपनीयता विधि से लौटाना, जो कॉलर को ऑब्जेक्ट के स्थिति पर अप्रत्यक्ष रूप से हेरफेर करने की अनुमति देता है। यह आमतौर पर विधि-श्रृंखला कार्यान्वयन में होता है; नियम VNA04-J देखें। सुनिश्चित करें कि अधिक जानकारी के लिए जंजीर विधियों पर कॉल परमाणु हैं। इसे उस वर्ग के निर्माता से बुलाए गए विदेशी विधि के लिए तर्क के रूप में पास करना जिसका उद्देश्य बनाया जा रहा है। आंतरिक कक्षाओं का उपयोग करना। एक आंतरिक वर्ग स्पष्ट रूप से अपने बाहरी वर्ग के उदाहरण का संदर्भ रखता है जब तक कि आंतरिक वर्ग को स्थैतिक घोषित नहीं किया जाता है। इसे उस वर्ग के निर्माता से सार्वजनिक स्थैतिक चर को असाइन करके प्रकाशित करना जिसका उद्देश्य बनाया जा रहा है। एक निर्माता से अपवाद फेंकना। ऐसा करने से कोड को अंतिम रूप से हमले के लिए कमजोर हो सकता है; नियम ओबीजे 11-जे देखें। से सावधान रहें, रचनाकारों को अधिक जानकारी के लिए अपवाद फेंक दें। आंतरिक ऑब्जेक्ट स्थिति को एक विदेशी विधि में पास करना। यह आंतरिक सदस्य ऑब्जेक्ट के इस संदर्भ को पुनर्प्राप्त करने के लिए विधि को सक्षम बनाता है।
यह नियम ऑब्जेक्ट निर्माण के दौरान भागने के संदर्भ को अनुमति देने के संभावित परिणामों का वर्णन करता है, जिसमें दौड़ स्थितियों और अनुचित प्रारंभिकरण शामिल हैं। उदाहरण के लिए, फ़ील्ड अंतिम घोषित करना सामान्य रूप से सुनिश्चित करता है कि सभी थ्रेड पूरी तरह से आरंभिक स्थिति में फ़ील्ड देखते हैं; हालांकि, ऑब्जेक्ट निर्माण के दौरान से बचने के लिए इस संदर्भ को अनन्य या आंशिक रूप से प्रारंभिक स्थिति में फ़ील्ड का खुलासा कर सकते हैं। नियम टीएसएम03-जे। आंशिक रूप से प्रारंभिक ऑब्जेक्ट्स प्रकाशित नहीं करते हैं, जो सुरक्षित प्रकाशन के लिए विभिन्न तंत्र द्वारा प्रदान की गई की गारंटी देता है, इस नियम के अनुरूप पर निर्भर करता है। नतीजतन, कार्यक्रमों को ऑब्जेक्ट निर्माण के दौरान बचने के लिए इस संदर्भ को अनुमति नहीं देनी चाहिए।
सामान्यतः, उन मामलों का पता लगाना महत्वपूर्ण है जिनमें यह संदर्भ वर्तमान संदर्भ के दायरे से बाहर निकल सकता है। विशेष रूप से, सार्वजनिक चर और विधियों को ध्यान से जांचना चाहिए।
अच्छा और अच्छी तरह से पूछे जाने वाले प्रश्न। – Maroun