前言
Fastjson是阿里巴巴开源的一个高性能Java JSON库,广泛用于Java对象的序列化和反序列化操作。在SpringBoot项目中,Fastjson常被用作JSON处理工具。然而,Fastjson因其高性能而广受欢迎的同时,也因多次爆出的安全漏洞而备受关注。本文将介绍如何在SpringBoot项目中正确使用Fastjson,并讨论相关的安全实践。
一、SpringBoot项目中集成Fastjson
- 添加Fastjson依赖
<!-- pom.xml 中添加Fastjson依赖 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.25</version> <!-- 请使用最新稳定版本 -->
</dependency>
- 配置Fastjson作为默认JSON处理器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {// 1.构建FastJson消息转换器 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();// 2.创建FastJson配置类 FastJsonConfig fastJsonConfig = new FastJsonConfig();// 3.自定义配置fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, // 格式化输出 SerializerFeature.WriteMapNullValue, // 输出空字段 SerializerFeature.WriteNullListAsEmpty, // 空列表输出[]而非null SerializerFeature.DisableCircularReferenceDetect // 禁止循环引用 );// 4.日期格式化 fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");// 5.处理中文乱码List<MediaType> fastMediaTypes = new ArrayList<>();fastMediaTypes.add(MediaType.APPLICATION_JSON);fastConverter.setSupportedMediaTypes(fastMediaTypes);// 6.将FastJson配置注入消息转换器 fastConverter.setFastJsonConfig(fastJsonConfig);// 7.将FastJson添加到视图消息转换器列表 converters.add(0, fastConverter);}
}
二、Fastjson的基本使用
- JSON序列化
// Java对象转JSON字符串
User user = new User(1, "张三", 25);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);// 格式化输出
String prettyJson = JSON.toJSONString(user, SerializerFeature.PrettyFormat);
- JSON反序列化
// JSON字符串转Java对象
String jsonStr = "{\"id\":1,\"name\":\"张三\",\"age\":25}";
User user = JSON.parseObject(jsonStr, User.class);// 复杂对象转换
List<User> users = JSON.parseArray("[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]", User.class);
三、Fastjson的安全问题与防护
- 常见安全漏洞
Fastjson历史上出现过多个高危漏洞,主要包括:
- 反序列化漏洞(如Fastjson 1.2.24及之前版本的远程代码执行漏洞)
- 类型解析漏洞
- 拒绝服务攻击漏洞
- 信息泄露漏洞
- 安全防护措施
(1) 及时更新Fastjson版本
始终使用Fastjson的最新稳定版本,老版本可能存在已知漏洞。
<!-- 定期检查并更新到最新版本 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.25</version> <!-- 撰写本文时的最新稳定版 -->
</dependency>
(2) 关闭AutoType功能
AutoType是Fastjson的一个特性,允许在反序列化时自动识别类型,但这也是许多漏洞的根源。
FastJsonConfig config = new FastJsonConfig();
// 禁用AutoType
ParserConfig.getGlobalInstance().setAutoTypeSupport(false);
(3) 使用安全模式
// 设置安全模式
ParserConfig.getGlobalInstance().setSafeMode(true);
在安全模式下,Fastjson会完全禁用AutoType功能。
(4) 自定义反序列化过滤器
// 定义白名单,只允许特定类被反序列化
ParserConfig.getGlobalInstance().addAccept("com.example.model.");
或者:
// 使用反序列化过滤器
public class SafeObjectDeserializer implements ObjectDeserializer {// 实现安全的反序列化逻辑
}// 注册自定义反序列化器
ParserConfig.getGlobalInstance().putDeserializer(User.class, new SafeObjectDeserializer());
(5) 输入验证
对所有传入的JSON数据进行验证,防止恶意输入:
public static <T> T parseJsonSafely(String json, Class<T> clazz) {if (!isValidJson(json)) {throw new IllegalArgumentException("Invalid JSON input");}return JSON.parseObject(json, clazz, Feature.SafeMode);
}
四、Fastjson的最佳实践
- 生产环境必须使用最新稳定版
- 默认关闭AutoType功能
- 对不可信数据源使用安全模式
- 限制反序列化的类范围
- 避免直接反序列化用户输入的JSON数据
- 结合Spring Security等安全框架进行防护
- 定期关注Fastjson的安全公告
五、替代方案
如果对Fastjson的安全性仍有顾虑,可以考虑以下替代方案:
- Jackson - Spring Boot默认集成的JSON库
- Gson - Google提供的JSON库
- Hutool-json - 国产工具包中的JSON模块
结语
Fastjson是一款性能优异的JSON处理库,但在使用时必须重视其安全性问题。通过合理的配置和安全实践,我们可以在享受Fastjson高性能的同时,确保应用的安全性。记住,安全无小事,特别是在处理用户输入时,必须始终保持警惕。
参考资源
- Fastjson GitHub仓库
- Fastjson Wiki
- Fastjson安全公告
- OWASP JSON安全指南