温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java反序列化是什么

发布时间:2026-10-05 03:10:27 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

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();

二、为什么需要反序列化

常见使用场景:

  • 网络传输(RPC、HTTP、消息队列)
  • 对象持久化(存文件、存数据库)
  • 分布式系统(Spring、Dubbo、Redis 等)

三、Java 反序列化的基本要求

一个类要被序列化 / 反序列化:

  1. 实现 Serializable 接口
  2. 有 serialVersionUID(建议显式声明)
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
}

四、反序列化过程发生了什么

当执行 readObject():

  1. 读取字节流
  2. 根据类名创建对象
  3. 自动调用对象内部逻辑
  4. 可能触发:
    • 构造方法之外的代码
    • readObject()
    • toString()
    • hashCode()

⚠️ 这正是安全风险来源


五、Java 反序列化漏洞(重点)

1️⃣ 什么是反序列化漏洞

不可信数据被反序列化 → 执行恶意代码

攻击者构造特殊字节流:

  • 在反序列化时
  • 自动调用危险方法
  • 导致 RCE(远程代码执行)

2️⃣ 典型利用链(Gadget Chain)

例如:

  • Apache Commons Collections
  • Fastjson
  • Jackson
  • Log4j(间接相关)

攻击流程示意:

恶意字节流
   ↓
readObject()
   ↓
触发 getter / setter
   ↓
执行命令

3️⃣ 为什么 Java 特别容易出问题

  • 反序列化自动执行代码
  • 类型信息写在字节流中
  • 框架复杂度高

六、如何防范反序列化风险

✅ 推荐做法:

  • ❌ 不反序列化不可信数据
  • ✅ 使用 JSON(Jackson / Gson)
  • ✅ 白名单校验类
  • ✅ 使用 ObjectInputFilter(Java 9+)
  • ✅ 及时升级依赖
ObjectInputFilter filter = info -> 
    info.serialClass() == User.class 
        ? ObjectInputFilter.Status.ALLOWED 
        : ObjectInputFilter.Status.REJECTED;

七、一句话总结

Java 反序列化就是把字节流变回对象,但如果数据不可信,就可能变成“执行恶意代码的入口”。

如果你愿意,我也可以:

  • 用通俗比喻讲
  • 讲真实漏洞案例
  • 讲如何审计代码风险
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手