🌺个人主页:杨永杰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:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
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 <=1.2.68
fastjson sec版本 <= sec9
android 版本不受此漏洞影响
3. 漏洞验证
- 使用 JNDI 配合 RMI&LDAP 二阶注入或者字节码本地注入即可。
- 字节码本地注入可以不受 JDK 修复限制且不受目标机器网络环境限制,此种利用方式对于攻击者更为有利。
- 对于该漏洞,官方建议升级到最新版本 1.2.69 或更新的 1.2.70 版本,来规避相关的风险。
- 项目地址:
- https://github.com/alibaba/fastjson
- fastjson 官方安全公告:
黑产与高危漏洞
随着网络技术不断升级,网络安全形势日益严峻。近年来,数据泄漏、网络敲诈等各类网络安全事件频发,给企业及社会发展带来严重影响。而这些在网络空间潜滋暗长的黑产,多数都与高危漏洞相关。