Java 反序列化(Deserialization) 是 Java 中一种将字节流恢复为 Java 对象的机制,和“序列化(Serialization)”正好相反。
序列化(Serialization)
把 Java 对象转换成字节流(方便存储或网络传输)
反序列化(Deserialization)
把字节流重新还原成 Java 对象
示例:
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
oos.writeObject(obj);
// 反序列化
ObjectInputStream ois = new ObjectInputStream(inputStream);
Object obj = ois.readObject();
常见使用场景:
一个类要被序列化 / 反序列化:
Serializable 接口serialVersionUID(建议显式声明)public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
}
当执行 readObject():
readObject()toString()hashCode()⚠️ 这正是安全风险来源
不可信数据被反序列化 → 执行恶意代码
攻击者构造特殊字节流:
例如:
攻击流程示意:
恶意字节流
↓
readObject()
↓
触发 getter / setter
↓
执行命令
✅ 推荐做法:
ObjectInputFilter(Java 9+)ObjectInputFilter filter = info ->
info.serialClass() == User.class
? ObjectInputFilter.Status.ALLOWED
: ObjectInputFilter.Status.REJECTED;
Java 反序列化就是把字节流变回对象,但如果数据不可信,就可能变成“执行恶意代码的入口”。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。