Java安全:SpringBoot项目中Fastjson组件的使用与安全实践

前言

Fastjson是阿里巴巴开源的一个高性能Java JSON库,广泛用于Java对象的序列化和反序列化操作。在SpringBoot项目中,Fastjson常被用作JSON处理工具。然而,Fastjson因其高性能而广受欢迎的同时,也因多次爆出的安全漏洞而备受关注。本文将介绍如何在SpringBoot项目中正确使用Fastjson,并讨论相关的安全实践。

一、SpringBoot项目中集成Fastjson

  1. 添加Fastjson依赖
<!-- pom.xml 中添加Fastjson依赖 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.25</version> <!-- 请使用最新稳定版本 -->
</dependency>
  1. 配置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的基本使用

  1. 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);
  1. 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的安全问题与防护

  1. 常见安全漏洞

Fastjson历史上出现过多个高危漏洞,主要包括:

  • 反序列化漏洞(如Fastjson 1.2.24及之前版本的远程代码执行漏洞)
  • 类型解析漏洞
  • 拒绝服务攻击漏洞
  • 信息泄露漏洞
  1. 安全防护措施

(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的最佳实践

  1. 生产环境必须使用最新稳定版
  2. 默认关闭AutoType功能
  3. 对不可信数据源使用安全模式
  4. 限制反序列化的类范围
  5. 避免直接反序列化用户输入的JSON数据
  6. 结合Spring Security等安全框架进行防护
  7. 定期关注Fastjson的安全公告

五、替代方案

如果对Fastjson的安全性仍有顾虑,可以考虑以下替代方案:

  1. Jackson - Spring Boot默认集成的JSON库
  2. Gson - Google提供的JSON库
  3. Hutool-json - 国产工具包中的JSON模块

结语

Fastjson是一款性能优异的JSON处理库,但在使用时必须重视其安全性问题。通过合理的配置和安全实践,我们可以在享受Fastjson高性能的同时,确保应用的安全性。记住,安全无小事,特别是在处理用户输入时,必须始终保持警惕。

参考资源

  1. Fastjson GitHub仓库
  2. Fastjson Wiki
  3. Fastjson安全公告
  4. OWASP JSON安全指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89277.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。注意&#xff1a;不允许使用示例 1&#xff1a;输入&#xff1a;x 4 输出&#xff1a;2示例 2&#xff1a;输入&#xff1…

oracle服务器定时备份Windows Server

-- 创建目录对象&#xff08;若未创建&#xff09;&#xff0c;先建立对应文件夹才能用目录对象CREATE OR REPLACE DIRECTORY dp_dirbackup AS D:\BACKUP; --配置路径 GRANT READ, WRITE ON DIRECTORY dp_dirbackup TO 用户名; --配置用户权限-- 备份脚本&#xff08;保存为每…

HTML data-* 属性 自定义属性

data-* 属性用于存储私有页面后应用的自定义数据。 data-* 属性可以在所有的 HTML 元素中嵌入数据。 自定义的数据可以让页面拥有更好的交互体验&#xff08;不需要使用 Ajax 或去服务端查询数据&#xff09;。 data-* 属性由以下两部分组成&#xff1a;1. 属性名不要包含大写字…

Oracle 大页配置use_large_pages 参数解析

一、前因 再给一位客户的Exdata 2 节点 RAC 19C版本创建数据库并配置好优化参数后&#xff0c;客户一天发来一份健康检查报告&#xff0c;打开一看 use_large_pages 配置异常。 回想安装部署时特意确认了在db启动大页已经生效&#xff0c;为何会有此异常告警项&#xff1f; 二…

迅为八核高算力RK3576开发板摄像头实时推理测试 ppyoloe目标检测

RK3576处理器迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。NPU高达6TOPS算力支持INT4/INT8/INT…

纯CSS轮播

纯CSS轮播 在现代网页设计中&#xff0c;轮播组件是一种常见的用户界面元素&#xff0c;广泛应用于展示图片、产品信息等内容。本文将详细介绍如何使用纯 HTML/CSS 和少量 JavaScript 实现一个功能完备的 CSS Scroll Snap 轮播组件。该组件不仅支持原生左右拖拽滚动&#xff0c…

从零开始的云计算生活——番外3,LVS+KeepAlived+Nginx高可用实现方案

目录 前言 一、环境搭建 1.环境准备 2.安装ipvsadm和keepalived&#xff08;Lvs服务器&#xff09;&#xff0c;nginx服务器安装nginx 3.为两台RS配置虚拟ip&#xff08;nginx服务器&#xff09; 1.配置虚拟网络子接口 2.ARP响应级别与通告行为的概念 3.配置ARP 二、Ke…

100201组件拆分_编辑器-react-仿低代码平台项目

文章目录1 设计UI&#xff0c;组件拆分2 实现关于1 设计UI&#xff0c;组件拆分 编辑器整体如上图所示&#xff0c;重点关注&#xff1a; flex弹性布局 上 左中右 下 左中右 画布居中画布Y轴滚动 2 实现 src/pages/question/Edit/index.tsx代码如下&#xff1a; import { …

CS课程项目设计2:交互友好的五子棋游戏

上次给大家分享了井字棋游戏的设计流程 CS课程项目设计1&#xff1a;交互友好的井字棋游戏-CSDN博客https://blog.csdn.net/weixin_36431280/article/details/149309500?spm1001.2014.3001.5501今天打算再分享进阶版井字棋游戏的版本设计——五子棋游戏。五子棋游戏操作方式与…

如何用山海鲸轻松构建3D智慧大屏?

一、什么是3D可视化大屏&#xff1f; 3D可视化大屏是一种结合了三维&#xff08;3D&#xff09;图形技术与数据可视化技术的信息展示平台&#xff0c;它通过在大型屏幕上以三维立体的形式呈现复杂的数据和信息&#xff0c;为用户提供直观、生动的视觉体验。这种技术将抽象的数…

牛客网 SQL 刷题(全部题目,最优解,复杂题有讲解)

刷题网址&#xff1a;https://www.nowcoder.com/exam/oj?questionJobId10&subTabNameonline_coding_page有时主页显示的题目序号与点进去之后的题目序号有所不同&#xff0c;这里以点进去之后的题目序号为主&#xff0c;如果日后还是有所出入&#xff0c;可以凭题目名称找…

Linux 系统管理基础教程

一、引言在 Linux 系统中&#xff0c;系统管理是一项至关重要的任务&#xff0c;它涉及到进程和服务的管理、系统运行级别的控制以及关机重启等操作。本文将详细介绍 Linux 系统管理的基础知识&#xff0c;帮助读者更好地理解和掌握 Linux 系统的管理技巧。二、Linux 中的进程和…

如何实战应用快鲸aiseo提升百度搜索排名?

百度搜索排名优化策略 百度搜索排名的提升&#xff0c;是企业获取在线可见性与自然流量的核心目标。有效的优化策略需基于对百度搜索算法原理的深入理解&#xff0c;遵循其重视内容质量与用户体验的核心准则。具体而言&#xff0c;这涉及构建完善的网站技术架构以确保高效爬取与…

element-plus——图标推荐

以下是 Element Plus 中适合编辑页面使用的图标组件示例:<!-- 编辑相关 --> <el-icon><Edit /></el-icon> <!-- 基础编辑图标 --> <el-icon><EditPen /></el-icon> <!-- 钢笔样式编辑图标 --&g…

黄仁勋链博会首秀:中国开源AI催化全球革命,机器人浪潮重塑未来工厂

7月16日&#xff0c;北京链博会开幕式迎来一位特殊演讲者——英伟达创始人黄仁勋身着唐装&#xff0c;首次以中文登台演讲。这位AI芯片巨头的掌舵人坦言“很紧张”&#xff0c;却清晰传递出一个重要观点&#xff1a;中国的开源AI已成为世界进步的催化剂&#xff0c;让每个国家、…

uniapp云托管前端网页

uniCloud控制台 实名认证

27、鸿蒙Harmony Next开发:ArkTS并发(Promise和async/await和多线程并发TaskPool和Worker的使用)

目录 异步并发 (Promise和async/await) Promise async/await 多线程并发 多线程并发模型 内存共享模型 Actor模型 TaskPool TaskPool运作机制 TaskPool注意事项 Concurrent装饰器 装饰器说明 装饰器使用示例 TaskPool扩缩容机制 扩容机制 缩容机制 Worker Wo…

Web前端:JavaScript鼠标事件

1. onclick&#xff08;鼠标单击事件&#xff09;触发条件&#xff1a;用户用鼠标左键单击元素时触发使用场景&#xff1a;按钮操作、菜单展开/关闭、提交表单等示例代码&#xff1a;<button id"myButton">点击我</button> <script>document.getEl…

控制台输出的JAVA格斗小游戏-面向对象

重温了黑马的这个小程序首先介绍一下&#xff1a;相当于一个小游戏&#xff0c;你打我一下&#xff0c;我打你一下&#xff1b;中间经历一些来回&#xff0c;最终根据血量的大小来判断谁输谁赢&#xff0c;实话讲黑马整个课在这个之前的题目没有什么难度&#xff0c;这个不难&a…

GitHub 趋势日报 (2025年07月15日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图1641claude-code1054markitdown545system-prompts-and-models-of-ai-tools538claud…