fastjson埋的「坑」,fastjson2.0能拯救吗?

1,457 阅读3分钟

大家好,我是马建仓。

在前后端数据传输交互中,JSON 因其以跨语言,跨前后端的优点常被开发者用来进行数据交换与解析。在 Java 中,主流的 JSON 库有以下三个:

  • fastjson:国内阿里巴巴公司所开发的 JSON 库
  • Jackson:Spring 默认的 JSON 库
  • Gson:谷歌出品的 JSON 库

关于 fastjson 的发展历程也有个有趣的故事。

2010 年,阿里巴巴有个资深的技术专家温绍锦(花名:高铁),他翻遍全网找不到一个好用的 JSON 解析库,便决定在业余时间自己写一个全世界最快的。彼时,阿里巴巴 B2B 平台技术部正在做应用监控系统 Dragoon,也需要一个高性能的 JSON 解析器和带监控功能的连接池。于是乎,这个解析器诞生了,并被命名为 fastjson,迄今为止 fastjson 已成为 Java 程序员常用的国产类库之一。

然而后来, fastjson 却时常被爆出漏洞问题,一度沦为网友的槽点,2020 年 8 月,因在阿里巴巴内网上被挂贴吐槽,fastjson 作者高铁还曾撰文公开回应争议。

为何会频出漏洞?

2019 年至 2020 年间,fastjson 的版本升级中都有关于 AutoType 的升级,或许这就是原因之一。这个功能是在序列化的 JSON 字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。

为了全面修复和升级 fastjson,今年 4 月底,温少大佬正式开源了 fastjson v2,不久前,fastjson v2 已获 Gitee 官方推荐。大家可以前往项目地址与大佬直接沟通,同时也可自行测试复现看看 fastjson v2 效果究竟如何。

开源许可证: Apache-2.0 项目地址仓库地址

fastjson v2 的「十年目标」

从项目仓库可知,fastjson v2 是 fastjson 项目的重要升级,性能有了很大提升,目标是为下一个十年提供一个高性能的 JSON 库,两者采用同一套 API。

据作者表述,fastjson v2 已经解决了 fastjson 的 Auto Type RCE 的问题。

今天,我们就来探索一下这个性能升级的 fastjson v2 有何优势,又应该如何使用呢?

性能支持

  • 支持 JSON/JSONB 两种协议,JSONPath 是一等公民
  • 支持全量解析和部分解析
  • 支持 Java 服务端、客户端 Android、大数据场景
  • 支持 Kotlin
  • 支持 JSON Schema
  • 支持 Android 8+ (2.0.11.android)
  • 支持 Graal Native-Image (2.0.11.graal)

使用前需要准备

1.搭建测试环境

2.添加对应依赖

双方用户组(GroupId)不一致

fastjson v2 的 GroupId 和 fastjson 1.x 的不一样

fastjson v2 为:com.alibaba.fastjson2

MAVEN 依赖:

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.11</version>
</dependency>

Gradle 依赖:

dependencies {
    implementation 'com.alibaba.fastjson2:fastjson2:2.0.11'
}

3.采用其他模块

  1. fastjson v1 兼容包

如果原来使用 fastjson 1.2.x 版本,可以使用兼容包,兼容包不能保证 100% 兼容

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.11</version>
</dependency>
  1. fastjson Kotlin 集成模块

如果项目使用 Kotlin,可以使用 fastjson-kotlin 模块,使用方式上采用 kotlin 的特性

  1. fastjson Extension 扩展模块

如果项目使用 SpringFramework 等框架,可以使用 fastjson-extension 模块

注意:不同模块的源码可前往项目仓库查看 项目地址:点击一键获取源码

两种操作流程

简单方式

  1. 将 JSON 解析为 JSONObject
  2. 将 JSON 解析为 JSONArray
  3. 将 JSON 解析为 Java 对象
  4. 将 Java 对象序列化为 JSON
  5. 使用 JSONObject、JSONArray
  6. 将 JavaBean 对象序列化为 JSON

进阶方式

使用 JSONB

  1. 将 JavaBean 对象序列化 JSONB
  2. 将 JSONB 数据解析为 JavaBean

使用 JSONPath

  1. 使用 JSONPath 读取部分数据
  2. 使用 JSONPath 读取部分 byte[]的数据
  3. 使用 JSONPath 读取部分 byte[]的数据(注意这里使用 ofJSONB 方法)

注意:源代码请点击此处,一键获取源码

fastjson v2 的具体测试效果到底好不好,还得大家自己来试试咯。测试过程产生的疑惑与发现的 Bug,大家可前往项目仓库与作者一对一直接沟通~

关于Gitee

微信底部宣传banner-6.jpg