阅读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");
}
描述让我很好奇。什么是"恶意流"?这种方法如何防御呢?
答案 0 :(得分:6)
Instant
和其他java.time
类使用包作用域委托 - java.time.Ser
进行序列化。请参阅writeReplace
方法以了解如何创建委托。
因此,可以调用readObject
方法的唯一方法是,如果有人传入恶意流(一个用于尝试创建无效对象的唯一目的)。该例外可确保阻止此类恶意流。
通常,只要使用序列化委托,就应该考虑像这样阻止readObject
。
答案 1 :(得分:4)
使用这个writeReplace方法,序列化系统将会 永远不会生成封闭类的序列化实例,但是 攻击者可能会制造一个试图违反课程的人 不变量。为了保证这样的攻击失败,只需添加它 readObject方法到封闭类...
// readObject method for the serialization proxy pattern
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
throw new InvalidObjectException("Proxy required");
}