精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

為什么決定禁用FastJson

為什么決定禁用FastJson,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

網站建設公司,為您提供網站建設,網站制作,網頁設計及定制網站建設服務,專注于成都定制網頁設計,高端網頁制作,對樓梯護欄等多個行業擁有豐富的網站建設經驗的網站建設公司。專業網站設計,網站優化推廣哪家好,專業成都網站營銷優化,H5建站,響應式網站。

老項目中使用到多種json類庫,沒有統一管理。最近開啟全新的項目,準備對json類庫進行統一,這樣不僅能夠壓縮jar包的大小,也能夠避免某個類庫的漏洞導致系統問題。

其實,就在前幾個月因為FastJson的漏洞,已經全面升級過一次FastJson的版本。現在項目中有用FastJson,有用gson,也有用Jackson。雖然用的類庫比較多,但使用的場景并不多,還在可控范圍之內。

下面重點講講對FastJson的一些調研,雖然最終決定強制在項目中禁用FastJson,但在放棄之前,還是要學習一下這個類庫的。

FastJson簡介

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

由于接口簡單易用,已經被廣泛使用在緩存序列化,協議交互,Web輸出等各種應用場景中。

FastJson的簡單示例

先用一個簡單的示例來演示一下FastJson的使用。先在項目中引入FastJson類庫:


    com.alibaba
    fastjson
    1.2.70

關于版本至少要在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 parseObject(String text, Class clazz); // 把JSON文本parse為JavaBean 
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
public static final  List parseArray(String text, Class 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排行第四,僅次于第三位的JSON In Java。如果考慮到國內大多數用阿里鏡像,那么FastJson的排位要更靠前一些,但與Jackson相比差距還是有的。

設計與代碼質量

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

外國友人不喜歡FastJson是因為感覺代碼質量不高。知乎上有一篇相關的文章,雖然寫2016年,但也可以參考一下(鏈接:https://www.zhihu.com/question/44199956)。
為什么決定禁用FastJson

對于上述原因,我個人倒是更看重高贊回答中的總結“用很多投機取巧的的做法去實現所謂的’快’,而失去了原本應該兼容的java特性,對json標準遵循也不嚴格”。

是的,正是因為這個類庫來源于阿里的實踐,很多最初的設計與標準有一定的差距。而且已經被大量應用,就很難在后期改動。外加還經常出現不兼容性升級。

開源Issues

在寫這篇文章時,看了一下GitHub上項目的Issues,還有大量的需要修復的問題。而且版本還在頻繁的更新,修復升級。

為什么決定禁用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問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創新互聯行業資訊頻道了解更多相關知識。


網頁題目:為什么決定禁用FastJson
URL分享:http://m.jcarcd.cn/article/josgie.html
主站蜘蛛池模板: 欧美另类日韩成人 | 精品欧美一区二区视 | 精品国产欧 | 国产又黄| 成人动漫3d基地 | 91视频福利影院 | 国产美女福利导航 | 国产精品一区二区五 | 日本伊人色综合网 | 国产欧美一区二区 | 国产xx在线观看 | 日韩乱码人 | 97人人人人人 | 日韩欧美视频一二区 | 欧美午夜网 | 青青草极品视觉盛 | 精品视频九九九 | 日本三级乱伦国产 | 国产九九 | 97碰公| 韩国日本在线电影 | 国产精品玖玖玖 | 日本最新免费二区 | 日韩欧美在线伊人 | 午夜福利小视频 | 日韩精品a在线视频 | 国产后入在线观 | 精品亚洲午夜视频 | 国产午夜在线精品 | 福利一区二区在线 | 国产美女精 | 日韩精品成人亚洲毛 | 91无毒不卡 | 国产人成亚 | 日本不卡中文字幕 | 国产精品制服丝 | 国产日产欧美一级 | 欧美一级黄 | 福利秀视频在线播放 | 91深夜插爽 | 国产午夜免费视频 |