温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

为什么禁用FastJson

发布时间:2021-10-18 16:57:47 来源:亿速云 阅读:131 作者:iii 栏目:编程语言

这篇文章主要介绍“为什么禁用FastJson”,在日常操作中,相信很多人在为什么禁用FastJson问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”为什么禁用FastJson”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

FastJson简介

Fastjson是阿里巴巴的开源JSON解析库,基于Java语言,支持JSON格式的字符串与JavaBean之间的相互转换。它采用一种“假定有序快速匹配”的算法,把JSON  Parse的性能提升到了极致。

由于接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。

FastJson的简单示例

先用一个简单的示例来演示一下FastJson的使用。先在项目中引入FastJson类库:

<dependency>     <groupId>com.alibaba</groupId>     <artifactId>fastjson</artifactId>     <version>1.2.70</version> </dependency>

关于版本至少要在1.2.70以上,为啥?之前版本的漏洞太多。

定义个JavaBean,我们拿User为例:

public class User {      private String userName;      private int age;      private String address;          // getter/setter }

使用实例:

public static void main(String[] args) {      String json = "{\"address\":\"Beijing\",\"age\":28,\"user_name\":\"Tom\"}";     // 将json转换为JavaBean     User user = JSONObject.parseObject(json, User.class);     System.out.println(user);      // 将JavaBean转换为json     String result = JSONObject.toJSONString(user);     System.out.println(result); }

实例中先将json字符串通过parseObject转换成User对象,然后又将User对象通过toJSONString方法转换成json。用起来是不是非常方便?

同时在构造json时你是否发现json字符串中有“user_name”这样的格式,FastJson默认会将这种下划线格式的key,与JavaBean中驼峰格式的属性进行绑定。

执行程序,打印结果:

User(userName=Tom, age=28, address=Beijing) {"address":"Beijing","age":28,"userName":"Tom"}

可以看出成功执行。

FastJson还有其他一些常用的API,比如:

public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray  public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject     public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean  public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray  public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合  public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本  public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本  public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray。

通过上述API还可以实现:json字符串与JSONArray之间的转换、json字符串与javaBean之间的转换、json字符串-数组类型与javaBean之间的转换、JavaList与JsonArray之间的转换等。

为什么决定放弃FastJson

通过上面的示例来看FastJson的API使用起来也是非常简单,而且它的特点,也就是卖点就是“快”。

虽然网上有各种测试,质疑FastJson的“快”,但排除测试者测试用例或环境的影响,整体来看FastJson并不比市面上的其他同类框架慢。

那么放弃使用的原因是什么呢?

流行度

首先,它并不像我们想象中那么大受欢迎。来看一下FastJson的Maven引用量数据统计(来源https://mvnrepository.com/):

为什么禁用FastJson


fastjson

可以看出FastJson排行第四,仅次于第三位的JSON In  Java。如果考虑到国内大多数用阿里镜像,那么FastJson的排位要更靠前一些,但与Jackson相比差距还是有的。

设计与代码质量

在国外没有更受推广的原因大概有两个:推广(外加英文文档)和代码质量。

外国友人不喜欢FastJson是因为感觉代码质量不高。知乎上有一篇相关的文章,虽然写2016年,但也可以参考一下(链接:https://www.zhihu.com/question/44199956)。

为什么禁用FastJson

fastjson

对于上述原因,我个人倒是更看重高赞回答中的总结“用很多投机取巧的的做法去实现所谓的'快',而失去了原本应该兼容的java特性,对json标准遵循也不严格”。

是的,正是因为这个类库来源于阿里的实践,很多最初的设计与标准有一定的差距。而且已经被大量应用,就很难在后期改动。外加还经常出现不兼容性升级。

开源Issues

在写这篇文章时,看了一下GitHub上项目的Issues,还有大量的需要修复的问题。而且版本还在频繁的更新,修复升级。

为什么禁用FastJson

fastjson

还有1488个问题处于Open状态!看到此处,真的有些担心了。用的人多,提问题的人多,也可以从另外一个方面来说可能更安全,但如果还有这么多问题待解决,还是有些恐怖的。

漏洞修复历史

同时,前段时间FastJson多次被爆存在漏洞,而这些漏洞都与FastJson中的一个AutoType特性有关。

从2019年7月份发布的v1.2.59一直到2020年6月份发布的 v1.2.71 ,每个版本的升级中都有关于AutoType的升级。

1.2.59发布,增强AutoType打开时的安全性 fastjson  1.2.60发布,增加了AutoType黑名单,修复拒绝服务安全问题 fastjson  1.2.61发布,增加AutoType安全黑名单 fastjson  1.2.62发布,增加AutoType黑名单、增强日期反序列化和JSONPath fastjson  1.2.66发布,Bug修复安全加固,并且做安全加固,补充了AutoType黑名单 fastjson  1.2.67发布,Bug修复安全加固,补充了AutoType黑名单 fastjson  1.2.68发布,支持GEOJSON,补充了AutoType黑名单。(引入一个safeMode的配置,配置safeMode后,无论白名单和黑名单,都不支持autoType。) fastjson  1.2.69发布,修复新发现高危AutoType开关绕过安全漏洞,补充了AutoType黑名单 fastjson  1.2.70发布,提升兼容性,补充了AutoType黑名单

那么什么是AutoType?为什么又会导致漏洞呢?

对于JSON框架Java对象转换成字符串通常可以基于属性或setter/getter方法。FastJson和Jackson是通过遍历出该类中的所有getter方法进行的,Gson是通过反射遍历该类中的所有属性,并把其值序列化成json。。

当一个类中包含了一个接口(或抽象类),在使用FastJson进行序列化的时候,会将子类型抹去,只保留接口(抽象类)的类型,使得反序列化时无法拿到原始类型。

因此,FastJson引入了AutoType,在序列化时把原始类型记录下来。

有了autoType功能,FastJson在对JSON字符串进行反序列化时,会读取@type到内容,试图把JSON内容反序列化成对象,并且会调用它的setter方法。利用这个特性,就可以构造一个JSON字符串,并且使用@type指定一个自己想要使用的攻击类库。

到此,关于“为什么禁用FastJson”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI