🌺个人主页:杨永杰825_Spring,Mysql,多线程-CSDN博客
⭐每日一句:成为架构师路途遥远
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️
目录
前言
特点
使用
序列化和反序列化
将JSON字符串反序列化为Java对象
将Java对象转Json字符串
修改JSON字段的值
添加新的字段
高级特性
案例
扩展-漏洞
1. 漏洞描述
2. 影响版本
3. 漏洞验证
黑产与高危漏洞
前言
- 阿里巴巴fastjson是一个Java语言编写的开源的JSON解析器和生成器。它提供了一种快速、高效、灵活的处理JSON数据的方式,广泛应用于Java开发中。
- 与其他JSON解析库相比,fastjson具有更快的解析速度和更低的内存消耗。它支持将Java对象序列化为JSON字符串,并且可以将JSON字符串反序列化为Java对象。同时,fastjson还支持对JSON数据的操作和转换,可以方便地对JSON数据进行增删改查等操作。
github
特点
阿里巴巴的fastjson是一款高性能的JSON解析和序列化库,其实现原理主要包括以下几点:
-
采用Java的反射机制:fastjson使用Java的反射机制来解析JSON字符串,并将其转化为对应的Java对象。它通过读取对象的字段、方法和构造函数等信息来动态创建和操作对象。
-
内部数据结构:fastjson使用了自定义的数据结构来表示JSON数据。其中,JSON对象使用了JSONObject类来表示,它以一个Map来存储键值对;JSON数组使用了JSONArray类来表示,它以一个List来存储元素;JSON字符串、数字、布尔值等基本类型使用了相应的Java类型来表示。
-
解析算法:fastjson使用了递归下降解析算法来解析JSON字符串。它从字符串的起始位置开始,逐个字符地进行解析。在解析过程中,它会根据当前字符的类型进行不同的处理,例如,如果遇到{表示开始一个JSON对象,就会递归解析内部的键值对。
-
序列化算法:fastjson使用深度优先遍历算法将Java对象序列化为JSON字符串。在这个过程中,它会遍历对象的属性、字段和方法,并根据其类型来生成对应的JSON字符串。
-
高性能优化:fastjson进行了多项性能优化,使得它在解析和序列化JSON时具有很高的效率。例如,它会缓存解析过的类结构,避免重复解析;在序列化时,采用了一些技巧来减少内存分配和字符串拼接操作,提高效率。
总的来说,fastjson通过反射机制解析JSON字符串并创建Java对象,使用自定义的数据结构表示JSON数据,采用递归下降算法进行解析,使用深度优先遍历算法进行序列化,并通过高性能优化来提高解析和序列化的效率。这些特点使得fastjson成为一款高性能的JSON库。
使用
使用阿里巴巴的fastjson可以按照以下步骤进行:
添加依赖:在你的项目中添加fastjson的依赖。可以通过Maven或Gradle等构建工具来添加依赖,如下所示:
Maven:
com.alibaba fastjson 1.2.78
Gradle:
implementation 'com.alibaba:fastjson:1.2.78'
导入类:在你的Java类中导入fastjson的相关类,如下所示:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.serializer.SerializerFeature;
序列化和反序列化
使用fastjson进行对象和JSON字符串之间的序列化和反序列化操作。例如,将Java对象序列化为JSON字符串:
User user = new User("John", 25); String jsonString = JSON.toJSONString(user);
将JSON字符串反序列化为Java对象
String jsonString = "{\"name\":\"John\",\"age\":25}"; User user = JSON.parseObject(jsonString, User.class);
将Java对象转Json字符串
User user = new User(); user.setId(1); user.setName("Alice"); user.setAge(25); String jsonString = JSON.toJSONString(user); System.out.println(jsonString);
JSON操作
可以使用fastjson进行JSON数据的操作,例如获取字段值、修改字段值、添加新字段等。例如,获取JSON字段的值
String jsonString = "{\"name\":\"John\",\"age\":25}"; JSONObject jsonObject = JSON.parseObject(jsonString); String name = jsonObject.getString("name"); int age = jsonObject.getIntValue("age");
修改JSON字段的值
jsonObject.put("age", 26);
添加新的字段
jsonObject.put("gender", "Male");
高级特性
fastjson还提供一些高级特性,如自定义序列化和反序列化过程、配置项的设置等。例如,关闭循环引用检测:
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
以上是快速了解阿里巴巴fastjson的基本使用方法,你可以根据具体需求深入学习和使用fastjson的更多功能和特性。
案例
下面是一个使用阿里巴巴的fastjson库的简单示例:
import com.alibaba.fastjson.JSON; public class FastJsonExample { public static void main(String[] args) { // 将JSON字符串转换为Java对象 String jsonStr = "{\"id\": 1, \"name\": \"Alice\", \"age\": 25}"; User user = JSON.parseObject(jsonStr, User.class); System.out.println("User details:"); System.out.println("ID: " + user.getId()); System.out.println("Name: " + user.getName()); System.out.println("Age: " + user.getAge()); // 将Java对象转换为JSON字符串 User newUser = new User(); newUser.setId(2); newUser.setName("Bob"); newUser.setAge(30); String jsonString = JSON.toJSONString(newUser); System.out.println("JSON string: " + jsonString); } } class User { private int id; private String name; private int age; // getter and setter methods public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
这个例子演示了如何将JSON字符串转换为Java对象,以及如何将Java对象转换为JSON字符串。在示例中,先通过JSON.parseObject()将JSON字符串转换为User对象,然后打印出对象的属性。然后,创建一个User对象,并使用JSON.toJSONString()将其转换为JSON字符串。最后打印出JSON字符串。
请确保在使用该示例时,已将fastjson库添加到项目的依赖中。
扩展-漏洞
1. 漏洞描述
fastjson 采用黑白名单的方法来防御反序列化漏洞,导致当黑客不断发掘新的反序列化 Gadgets 类时,在 autoType 关闭的情况下仍然可能可以绕过黑白名单防御机制,造成远程命令执行漏洞。经研究,该漏洞利用门槛较低,可绕过 autoType 限制,风险影响较大。阿里云应急响应中心提醒 fastjson 用户尽快采取安全措施阻止漏洞攻击。
2. 影响版本
fastjson
-