Instant.readObject方法"保护[s]对抗恶意流&#34 ;?是什么意思?

时间:2015-12-11 11:32:00

标签: java stream java-8 java-time

阅读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");
}

描述让我很好奇。什么是"恶意流"?这种方法如何防御呢?

2 个答案:

答案 0 :(得分:6)

Instant和其他java.time类使用包作用域委托 - java.time.Ser进行序列化。请参阅writeReplace方法以了解如何创建委托。

因此,可以调用readObject方法的唯一方法是,如果有人传入恶意流(一个用于尝试创建无效对象的唯一目的)。该例外可确保阻止此类恶意流。

通常,只要使用序列化委托,就应该考虑像这样阻止readObject

答案 1 :(得分:4)

“Effective Java”的作者Joshua Bloch介绍了his idea关于序列化代理模式的内容。非常有启发性的问题背景。

  

使用这个writeReplace方法,序列化系统将会   永远不会生成封闭类的序列化实例,但是   攻击者可能会制造一个试图违反课程的人   不变量。为了保证这样的攻击失败,只需添加它   readObject方法到封闭类...

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