Item 88 摘要:防御性地编写 readObject 方法

Item 88 摘要:防御性地编写 readObject 方法

💡 原文约300字/词,阅读约需2分钟。
📝

内容提要

Java的序列化在反序列化时存在安全隐患,攻击者可通过操控字节流破坏类的不变性。为确保安全,建议在反序列化时进行防御性复制、验证不变性,并避免调用可被重写的方法。使用代理模式可降低复杂性和风险。

🎯

关键要点

  • Java的序列化在反序列化时存在安全隐患,攻击者可通过操控字节流破坏类的不变性。
  • 反序列化时,readObject方法需要像传统构造函数一样受到保护。
  • 攻击者可以制造字节流,引用类内部的可变对象,从而改变序列化实例的状态。
  • 在反序列化时,必须对可变对象进行防御性复制,确保类的不变性。
  • 在复制后,需验证对象的值是否符合类的规则,若违反则抛出InvalidObjectException。
  • 避免在反序列化过程中调用可被重写的方法,以防止执行未完全加载类的代码。
  • 建议使用代理模式进行序列化,以降低复杂性和减少反序列化的风险。
  • 在处理readObject时,需像对待公共构造函数一样进行数据验证和保护。

延伸问答

Java的反序列化存在哪些安全隐患?

Java的反序列化可能被攻击者通过操控字节流来破坏类的不变性,导致实例状态被改变。

如何确保反序列化过程中的类不变性?

在反序列化时,必须对可变对象进行防御性复制,并验证对象的值是否符合类的规则。

readObject方法需要哪些保护措施?

readObject方法应像传统构造函数一样受到保护,避免调用可被重写的方法,并进行数据验证。

为什么要避免在反序列化中调用可被重写的方法?

避免调用可被重写的方法是为了防止执行未完全加载类的代码,从而降低安全风险。

什么是防御性复制,为什么重要?

防御性复制是指在反序列化时复制可变对象,以确保类的不变性,防止外部修改影响实例状态。

使用代理模式进行序列化有什么好处?

使用代理模式可以降低序列化的复杂性,并减少反序列化过程中的风险。

➡️

继续阅读