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

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

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

内容提要

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

🎯

关键要点

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

继续阅读