2015-12-11 4 views
8

Instant वर्ग के लिए स्रोत कोड पढ़ना, मैं इस विधिइसका क्या मतलब है कि Instant.readObject विधि "की रक्षा [एस] दुर्भावनापूर्ण धाराओं के खिलाफ"?

/** 
* Defend against malicious streams. 
* 
* @param s the stream to read 
* @throws InvalidObjectException always 
*/ 
private void readObject(ObjectInputStream s) throws InvalidObjectException { 
    throw new InvalidObjectException("Deserialization via serialization delegate"); 
} 

विवरण मुझे उत्सुक मिला टकरा। एक "दुर्भावनापूर्ण धारा" क्या है? और यह तरीका इसके खिलाफ बचाव कैसे कर रहा है? java.time.Ser -

+0

ए 'दुर्भावनापूर्ण स्ट्रीम "एक है कि एक अनुभवहीन विकोडक होगा कुछ बुरा की तरह एक विशाल आवंटित करते है स्मृति या दुर्घटना की मात्रा। –

+0

आप उत्तर क्यों पोस्ट नहीं करते? लगता है एक दिलचस्प विषय –

+1

ध्यान दें कि यह 'Instant' के लिए विशिष्ट नहीं है। 'लोकलडेट टाइम ',' लोकलडेट 'और अन्य लोगों के पास यह भी है। – Tunaki

उत्तर

6

Instant, और अन्य java.time कक्षाएं, का उपयोग करते हुए एक पैकेज प्रतिनिधि scoped क्रमानुसार लगे हुए हैं। यह देखने के लिए कि प्रतिनिधि कैसे बनाया गया है, writeReplace विधि देखें।

इस प्रकार, readObject विधि को कॉल करने का एकमात्र तरीका यह है कि अगर कोई दुर्भावनापूर्ण धारा में गुजर रहा है (एक अमान्य वस्तु बनाने की कोशिश करने के एकमात्र उद्देश्य के लिए बनाया गया है)। अपवाद सुनिश्चित करता है कि ऐसी दुर्भावनापूर्ण धाराओं को अवरुद्ध कर दिया गया है।

सामान्य तौर पर, किसी भी समय है कि एक क्रमबद्धता प्रतिनिधि प्रयोग किया जाता है, तो आप readObject इस तरह अवरुद्ध करने पर विचार करना चाहिए।

4

यहोशू बलोच "प्रभावी जावा" के लेखक his idea क्रमबद्धता प्रॉक्सी पैटर्न के बारे में शुरू की है। आपके प्रश्न के लिए बहुत प्रबुद्ध पृष्ठभूमि।

स्थान पर इस writeReplace विधि के साथ

, क्रमबद्धता प्रणाली संलग्नित क्लास के एक धारावाहिक उदाहरण उत्पन्न कभी नहीं होगा, लेकिन एक हमलावर वर्ग ' अपरिवर्तनशीलताओं का उल्लंघन करने की कोशिश में एक निर्माण हो सकता है। गारंटी नहीं है कि इस तरह के हमले विफल हो जाएगा, केवल संलग्नित क्लास को यह readObject विधि जोड़ने ...

// readObject method for the serialization proxy pattern 
private void readObject(ObjectInputStream stream) throws InvalidObjectException { 
    throw new InvalidObjectException("Proxy required"); 
} 
+0

ग्रेट करने के लिए कुछ है चाहिए! वह पुस्तक एक उत्कृष्ट कृति है, निश्चित रूप से सटीक पढ़ने के लायक है ... –

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