自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

經(jīng)過多方調(diào)研,最終還是決定禁用FastJson!

開發(fā) 后端
老項(xiàng)目中使用到多種json類庫,沒有統(tǒng)一管理。最近開啟全新的項(xiàng)目,準(zhǔn)備對(duì)json類庫進(jìn)行統(tǒng)一,這樣不僅能夠壓縮jar包的大小,也能夠避免某個(gè)類庫的漏洞導(dǎo)致系統(tǒng)問題。

[[383027]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序新視界」,作者二師兄。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序新視界公眾號(hào)。  

老項(xiàng)目中使用到多種json類庫,沒有統(tǒng)一管理。最近開啟全新的項(xiàng)目,準(zhǔn)備對(duì)json類庫進(jìn)行統(tǒng)一,這樣不僅能夠壓縮jar包的大小,也能夠避免某個(gè)類庫的漏洞導(dǎo)致系統(tǒng)問題。

其實(shí),就在前幾個(gè)月因?yàn)镕astJson的漏洞,已經(jīng)全面升級(jí)過一次FastJson的版本?,F(xiàn)在項(xiàng)目中有用FastJson,有用gson,也有用Jackson。雖然用的類庫比較多,但使用的場(chǎng)景并不多,還在可控范圍之內(nèi)。

這篇文章重點(diǎn)講講對(duì)FastJson的一些調(diào)研,雖然最終決定強(qiáng)制在項(xiàng)目中禁用FastJson,但在放棄之前,還是要學(xué)習(xí)一下這個(gè)類庫的。

FastJson簡(jiǎn)介

Fastjson是阿里巴巴的開源JSON解析庫,基于Java語言,支持JSON格式的字符串與JavaBean之間的相互轉(zhuǎn)換。它采用一種“假定有序快速匹配”的算法,把JSON Parse的性能提升到了極致。

由于接口簡(jiǎn)單易用,已經(jīng)被廣泛使用在緩存序列化,協(xié)議交互,Web輸出等各種應(yīng)用場(chǎng)景中。

FastJson的簡(jiǎn)單示例

先用一個(gè)簡(jiǎn)單的示例來演示一下FastJson的使用。先在項(xiàng)目中引入FastJson類庫:

  1. <dependency> 
  2.     <groupId>com.alibaba</groupId> 
  3.     <artifactId>fastjson</artifactId> 
  4.     <version>1.2.70</version> 
  5. </dependency> 

關(guān)于版本至少要在1.2.70以上,為啥?之前版本的漏洞太多。

定義個(gè)JavaBean,我們拿User為例:

  1. public class User { 
  2.  
  3.     private String userName; 
  4.  
  5.     private int age; 
  6.  
  7.     private String address; 
  8.      
  9.     // getter/setter 

使用實(shí)例:

  1. public static void main(String[] args) { 
  2.  
  3.     String json = "{\"address\":\"Beijing\",\"age\":28,\"user_name\":\"Tom\"}"
  4.     // 將json轉(zhuǎn)換為JavaBean 
  5.     User user = JSONObject.parseObject(json, User.class); 
  6.     System.out.println(user); 
  7.  
  8.     // 將JavaBean轉(zhuǎn)換為json 
  9.     String result = JSONObject.toJSONString(user); 
  10.     System.out.println(result); 

實(shí)例中先將json字符串通過parseObject轉(zhuǎn)換成User對(duì)象,然后又將User對(duì)象通過toJSONString方法轉(zhuǎn)換成json。用起來是不是非常方便?

同時(shí)在構(gòu)造json時(shí)你是否發(fā)現(xiàn)json字符串中有“user_name”這樣的格式,F(xiàn)astJson默認(rèn)會(huì)將這種下劃線格式的key,與JavaBean中駝峰格式的屬性進(jìn)行綁定。

執(zhí)行程序,打印結(jié)果:

  1. User(userName=Tom, age=28, address=Beijing) 
  2. {"address":"Beijing","age":28,"userName":"Tom"

可以看出成功執(zhí)行。

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

  1. public static final Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray  
  2. public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject     
  3. public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse為JavaBean  
  4. public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray  
  5. public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合  
  6. public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文本  
  7. public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文本  
  8. public static final Object toJSON(Object javaObject); //將JavaBean轉(zhuǎn)換為JSONObject或者JSONArray。 

通過上述API還可以實(shí)現(xiàn):json字符串與JSONArray之間的轉(zhuǎn)換、json字符串與javaBean之間的轉(zhuǎn)換、json字符串-數(shù)組類型與javaBean之間的轉(zhuǎn)換、JavaList與JsonArray之間的轉(zhuǎn)換等。

為什么決定放棄FastJson

通過上面的示例來看FastJson的API使用起來也是非常簡(jiǎn)單,而且它的特點(diǎn),也就是賣點(diǎn)就是“快”。

雖然網(wǎng)上有各種測(cè)試,質(zhì)疑FastJson的“快”,但排除測(cè)試者測(cè)試用例或環(huán)境的影響,整體來看FastJson并不比市面上的其他同類框架慢。

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

流行度

首先,它并不像我們想象中那么大受歡迎。來看一下FastJson的Maven引用量數(shù)據(jù)統(tǒng)計(jì)(來源https://mvnrepository.com/):

 

 


fastjson

 

 

可以看出FastJson排行第四,僅次于第三位的JSON In Java。如果考慮到國內(nèi)大多數(shù)用阿里鏡像,那么FastJson的排位要更靠前一些,但與Jackson相比差距還是有的。

設(shè)計(jì)與代碼質(zhì)量

在國外沒有更受推廣的原因大概有兩個(gè):推廣(外加英文文檔)和代碼質(zhì)量。

外國友人不喜歡FastJson是因?yàn)楦杏X代碼質(zhì)量不高。知乎上有一篇相關(guān)的文章,雖然寫2016年,但也可以參考一下(鏈接:https://www.zhihu.com/question/44199956)。

 

fastjson

對(duì)于上述原因,我個(gè)人倒是更看重高贊回答中的總結(jié)“用很多投機(jī)取巧的的做法去實(shí)現(xiàn)所謂的'快',而失去了原本應(yīng)該兼容的java特性,對(duì)json標(biāo)準(zhǔn)遵循也不嚴(yán)格”。

是的,正是因?yàn)檫@個(gè)類庫來源于阿里的實(shí)踐,很多最初的設(shè)計(jì)與標(biāo)準(zhǔn)有一定的差距。而且已經(jīng)被大量應(yīng)用,就很難在后期改動(dòng)。外加還經(jīng)常出現(xiàn)不兼容性升級(jí)。

開源Issues

在寫這篇文章時(shí),看了一下GitHub上項(xiàng)目的Issues,還有大量的需要修復(fù)的問題。而且版本還在頻繁的更新,修復(fù)升級(jí)。

fastjson

 

還有1488個(gè)問題處于Open狀態(tài)!看到此處,真的有些擔(dān)心了。用的人多,提問題的人多,也可以從另外一個(gè)方面來說可能更安全,但如果還有這么多問題待解決,還是有些恐怖的。

漏洞修復(fù)歷史

同時(shí),前段時(shí)間FastJson多次被爆存在漏洞,而這些漏洞都與FastJson中的一個(gè)AutoType特性有關(guān)。

從2019年7月份發(fā)布的v1.2.59一直到2020年6月份發(fā)布的 v1.2.71 ,每個(gè)版本的升級(jí)中都有關(guān)于AutoType的升級(jí)。

  1. 1.2.59發(fā)布,增強(qiáng)AutoType打開時(shí)的安全性 fastjson 
  2.  
  3. 1.2.60發(fā)布,增加了AutoType黑名單,修復(fù)拒絕服務(wù)安全問題 fastjson 
  4.  
  5. 1.2.61發(fā)布,增加AutoType安全黑名單 fastjson 
  6.  
  7. 1.2.62發(fā)布,增加AutoType黑名單、增強(qiáng)日期反序列化和JSONPath fastjson 
  8.  
  9. 1.2.66發(fā)布,Bug修復(fù)安全加固,并且做安全加固,補(bǔ)充了AutoType黑名單 fastjson 
  10.  
  11. 1.2.67發(fā)布,Bug修復(fù)安全加固,補(bǔ)充了AutoType黑名單 fastjson 
  12.  
  13. 1.2.68發(fā)布,支持GEOJSON,補(bǔ)充了AutoType黑名單。(引入一個(gè)safeMode的配置,配置safeMode后,無論白名單和黑名單,都不支持autoType。) fastjson 
  14.  
  15. 1.2.69發(fā)布,修復(fù)新發(fā)現(xiàn)高危AutoType開關(guān)繞過安全漏洞,補(bǔ)充了AutoType黑名單 fastjson 
  16.  
  17. 1.2.70發(fā)布,提升兼容性,補(bǔ)充了AutoType黑名單 

那么什么是AutoType?為什么又會(huì)導(dǎo)致漏洞呢?

對(duì)于JSON框架Java對(duì)象轉(zhuǎn)換成字符串通??梢曰趯傩曰騭etter/getter方法。FastJson和Jackson是通過遍歷出該類中的所有g(shù)etter方法進(jìn)行的,Gson是通過反射遍歷該類中的所有屬性,并把其值序列化成json。。

當(dāng)一個(gè)類中包含了一個(gè)接口(或抽象類),在使用FastJson進(jìn)行序列化的時(shí)候,會(huì)將子類型抹去,只保留接口(抽象類)的類型,使得反序列化時(shí)無法拿到原始類型。

因此,F(xiàn)astJson引入了AutoType,在序列化時(shí)把原始類型記錄下來。

有了autoType功能,F(xiàn)astJson在對(duì)JSON字符串進(jìn)行反序列化時(shí),會(huì)讀取@type到內(nèi)容,試圖把JSON內(nèi)容反序列化成對(duì)象,并且會(huì)調(diào)用它的setter方法。利用這個(gè)特性,就可以構(gòu)造一個(gè)JSON字符串,并且使用@type指定一個(gè)自己想要使用的攻擊類庫。

小結(jié)

雖然FastJson有這么多問題,雖然決定不再使用FastJson,但同樣如知乎網(wǎng)友說的那樣“溫少幾乎憑一己之力撐起了一個(gè)被廣泛使用JSON庫,而其他庫幾乎都是靠一整個(gè)團(tuán)隊(duì),就憑這一點(diǎn),溫少作為“初心不改的阿里初代開源人”,當(dāng)之無愧。”對(duì)于FastJson的漏洞問題還是給予理解和包容。

責(zé)任編輯:武曉燕 來源: 程序新視界
相關(guān)推薦

2011-11-26 13:18:09

筆記本常見問題

2020-05-11 15:35:46

ChromeFirefox前端

2016-06-16 18:54:28

財(cái)政項(xiàng)目調(diào)研

2023-09-26 21:59:48

安全REST軟件架構(gòu)

2015-08-06 15:11:39

全覆蓋公共Wi-Fi萬科美好廣場(chǎng)信銳

2020-10-12 14:37:38

數(shù)據(jù)庫HiveSpark

2011-05-11 13:54:33

康普SYSTIMAX

2025-04-08 08:28:13

RetrofitKtor網(wǎng)絡(luò)庫

2024-04-29 08:53:10

大數(shù)據(jù)存儲(chǔ)數(shù)據(jù)

2018-08-27 10:35:22

華為

2019-12-16 10:35:19

WindowsWindows 7Windows 10

2012-04-24 13:39:28

多方通信

2020-08-12 15:29:33

蘋果iPhone微信

2015-06-26 16:53:58

2009-03-18 11:07:34

IP城域網(wǎng)交換機(jī)烽火網(wǎng)絡(luò)

2012-02-24 15:34:39

2012-06-14 13:55:29

英特爾舟山國稅

2018-10-09 11:33:44

云計(jì)算公共云智能ABC

2018-07-22 22:27:19

2010-09-02 14:31:19

網(wǎng)絡(luò)釣魚
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)