java - इसका मतलब क्या है कि झटपट.readObject विधि "दुर्भावनापूर्ण धाराओं के विरुद्ध रक्षा करें"?




stream java-8 (2)

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

इस लिखने की जगह की जगह के साथ विधि, क्रमबद्धता प्रणाली संलग्न वर्ग के एक धारावाहिक उदाहरण उत्पन्न कभी नहीं होगा, लेकिन एक हमलावर एक वर्ग 'invariants का उल्लंघन करने के प्रयास में एक बनाना हो सकता है इस तरह के हमले विफल होने की गारंटी देने के लिए, केवल पढ़ने योग्य कक्षा को संलग्न कक्षा में जोड़ें ...

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

Instant क्लास के लिए स्रोत कोड पढ़ना, मैंने इस विधि में टकराया

/**
 * 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");
}

विवरण मुझे जिज्ञासु मिला। "दुर्भावनापूर्ण धारा" क्या है? और इस पद्धति का कैसे विरोध है?


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

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

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







java-time