一、核心修复:升级到安全版本(优先级最高)
fastjson 漏洞的根源是早期版本的设计缺陷,升级版本是最彻底、最有效的修复方式,优先推荐迁移到 2.x 系列(重构了核心逻辑,安全性大幅提升)。
1. 升级到 fastjson2(2.x 版本,推荐)
这是官方主推的安全版本,完全重构了反序列化逻辑,默认关闭自动类型检测,从根本上规避了核心漏洞。
- Maven 依赖配置:
java
<!-- 移除旧的 1.x 依赖(关键:避免版本冲突) -->
<!-- <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency> -->
<!-- 添加 fastjson2 依赖(2025年最新稳定版) -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.50</version>
</dependency>
<!-- 可选:若项目中有大量 1.x 写法,可引入兼容包(减少代码修改) -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension</artifactId>
<version>2.0.50</version>
</dependency>
- Gradle 依赖配置:
Groovy
// 移除旧依赖
// implementation 'com.alibaba:fastjson:1.2.47'
// 添加 fastjson2
implementation 'com.alibaba.fastjson2:fastjson2:2.0.50'
// 可选兼容包
implementation 'com.alibaba.fastjson2:fastjson2-extension:2.0.50'
2. 临时升级到 1.x 安全版本(无法迁移 2.x 时)
若项目因兼容性问题暂时无法升级到 2.x,可升级到 1.x 系列的最新安全版本(仅临时过渡,建议最终迁移到 2.x):
<!-- 1.x 最新稳定版(2025年) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
升级后验证
执行以下命令确认依赖已更新:
bash
# Maven 验证
mvn dependency:tree | grep fastjson
# Gradle 验证
gradle dependencies | grep fastjson
输出应显示升级后的版本(如 2.0.50 或 1.2.83),无旧版本依赖。
二、临时防护:配置安全规则(无法立即升级时)
若暂时无法升级版本(如项目发布周期限制),可通过配置限制反序列化行为,阻断漏洞利用路径:
1. 核心安全配置(1.x 版本)
java
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.JSON;
public class FastjsonSecurityConfig {
// 项目启动时初始化(如 Spring 项目的 @PostConstruct 方法)
public static void initFastjsonSecurity() {
// 1. 关闭自动类型检测(核心:阻断漏洞利用的关键)
ParserConfig globalConfig = ParserConfig.getGlobalInstance();
globalConfig.setAutoTypeSupport(false);
// 2. 配置反序列化白名单(仅允许指定包下的类反序列化)
// 替换为你项目的实际包名,多个包可多次调用
globalConfig.addAccept("com.youproject.model.");
globalConfig.addAccept("com.youproject.dto.");
// 3. 禁用高危类(补充防护,防止绕过)
globalConfig.addDeny("com.sun.rowset.");
globalConfig.addDeny("java.lang.");
globalConfig.addDeny("org.apache.commons.");
// 4. 可选:使用自定义 ParserConfig,避免全局配置被篡改
ParserConfig customConfig = new ParserConfig();
customConfig.setAutoTypeSupport(false);
// 业务代码中使用自定义配置解析
// JSON.parseObject(jsonStr, User.class, customConfig);
}
}
2. Spring 项目集成示例
在 Spring 启动类中初始化安全配置:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
@SpringBootApplication
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
@PostConstruct
public void init() {
// 项目启动时加载 fastjson 安全配置
FastjsonSecurityConfig.initFastjsonSecurity();
}
}