fastjson的autotype机制默认关闭,需显式配置白名单支持多态反序列化,否则存在远程代码执行风险;推荐升级至fastjson2,其基于class对象的白名单机制更安全。

Fastjson 的 AutoType 机制默认关闭,若需支持多态反序列化(如 JSON 中包含 @type 字段),必须显式开启并严格配置白名单,否则存在严重反序列化漏洞(如远程代码执行)。核心原则是:只允许明确信任的类,禁用动态类加载,避免使用 autoTypeSupport=true 全局放开。
启用 AutoType 并设置基础白名单
从 Fastjson 1.2.68 开始,ParserConfig.getGlobalInstance().setAutoTypeSupport(true) 已被废弃且危险,不应使用。正确方式是创建独立的 ParserConfig 实例,并调用 addAccept 添加可反序列化的类名前缀或完整类名:
- 添加类名前缀(推荐):
config.addAccept("com.example.model.");—— 只允许com.example.model包下所有类 - 添加具体类(更安全):
config.addAccept("com.example.model.User"); - 可多次调用
addAccept添加多个条目,不支持通配符(如*)或正则表达式
配合 TypeReference 实现类型安全的多态解析
当 JSON 明确携带 @type 时(如 {"@type":"com.example.model.Admin","name":"Alice"}),仅靠白名单还不够,还需在反序列化时指定目标类型为父类或接口,并确保子类已在白名单中注册:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 定义基类或接口:
public abstract class Person { ... },子类Admin extends Person - 白名单中加入子类:
config.addAccept("com.example.model.Admin"); - 反序列化时用
TypeReference指定基类:JSON.parseObject(json, new TypeReference<person>(){});</person> - 注意:
@type值必须与白名单完全匹配(包括大小写和包路径)
禁用危险类、拦截非法 type 请求
即使配置了白名单,也建议主动拒绝已知高危类,并对非法 @type 做日志或抛异常处理:
- 调用
config.addReject("com.sun.")、config.addReject("org.apache.commons.collections")等常见利用链包名 - 设置自定义
BeforeFilter或继承DefaultExtJSONParser,在解析前校验@type是否在预期范围内 - 生产环境强烈建议关闭
autoType,改用@JSONField(serialize = false)+ 手动类型判断等更可控方式
升级到 Fastjson2(推荐长期方案)
Fastjson 1.x 的 AutoType 设计存在根本性安全缺陷,官方已停止维护。Fastjson2 默认完全禁用 @type,需显式启用 JSONReader.Feature.SupportAutoType 并传入白名单 Class 数组:
JSON.parse(json, User.class, ParseConfig.of(User.class, Admin.class));- 或使用
JSONFactory.getDefault().getParserConfig().addAccept(...)配置 - Fastjson2 白名单基于 Class 对象而非字符串,杜绝类名拼接绕过,安全性显著提升
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










