安全問題我們需要重視,立刻升級fastjson2
一、前言
小伙伴大家好,我是開源字節(jié)快速開發(fā)平臺的作者。fastjson2.0 是fastjson的重要升級,目標(biāo)是為下一個十年提供一個高性能的JSON庫,同一套API支持JSON/JSONB兩種協(xié)議。
近期fastjson 再報安全漏洞,直接給我們發(fā)送了高危告警,因此升級fastjson迫在眉睫。

FasterXML Jackson是美國FasterXML公司的一款適用于Java的數(shù)據(jù)處理工具。Jackson-databind是其中的一個具有數(shù)據(jù)綁定功能的組件。Jackson-databind可以將Java對象轉(zhuǎn)換成json對象,同樣也可以將json轉(zhuǎn)換成Java對象。
暫且不說 fastjson2 的性能提升,在安全方面也值得我們?nèi)ド?,這也是我們必須要去做的事。
二、罪魁禍?zhǔn)?AutoType
fastjson、jackson 都支持 AutoType 功能,這個功能在序列化的 JSON 字符串中帶上類型信息,在反序列化時,不需要傳入類型,實(shí)現(xiàn)自動類型識別。
三、fastjson1 安全問題
fastjson 1.x 內(nèi)部維護(hù)了一個白名單,java 發(fā)展近 30 年難免有些漏網(wǎng)之魚,這也造成近幾年 fastjson 安全漏洞頻發(fā)。
四、fastjson2 的設(shè)計
fastjson2 AutoType 必須顯示打開才能使用,沒有任何白名單,也不包括任何 Exception 類的白名單。這可以保證缺省配置下是安全的。
序列化時帶上類型信息,需要使用 JSONWriter.Feature.WriteClassName。比如:
很多時候,root對象是可以知道類型的,里面的對象字段是基類或者不確定類型,這個時候不輸出root對象的類型信息,可以減少序列化結(jié)果的大小,也能提升反序列化的性能。
反序列化打開AutoType功能支持自動類型
fastjson2 AutoType 支持配置 safeMode,在 safeMode 打開后,顯式傳入 AutoType 參數(shù)也不起作用,具體配置如下:
fastjson2 AutoType 會經(jīng)過內(nèi)置黑名單過濾。該黑名單能攔截大部分常見風(fēng)險,這個機(jī)制不能保證絕對安全,打開 AutoType 不應(yīng)該在暴露在公網(wǎng)的場景下使用。
五、序列化示例代碼
使用FastJson2JsonRedisSerializer實(shí)現(xiàn)RedisSerializer接口
六、升級到 fastjson2
6.1 兼容模式升級
升級可以通過兼容模式升級,兼容模式不需要改代碼,但在深度使用的場景,不能做到完全兼容。
兼容模式Maven依賴
6.2 使用新API升級
使用新API是建議的升級方式,使用新的API能獲得更多的功能。
包名編程
FASTJSON
v2和1.x版本使用不同的package,新的package名稱是com.alibaba.fastjson2,新package和之前不同,可以實(shí)現(xiàn)1.x和2.x共存
Maven依賴 Maven依賴的groupId和1.x不同,使用了新的groupId
com.alibaba.fastjson2
我們的項目沒有強(qiáng)制依賴 fastjson1,所以選擇了直接升級新 API。
最后
fastjson2 在性能和安全上都得到了很好的提升,開源字節(jié)開快速開發(fā)平臺已經(jīng)完成了升級,代碼改動較大,fork了我們倉庫的同學(xué)請及時更新,安全無小事,請慎重。
如若轉(zhuǎn)載,請注明出處:開源字節(jié) ? https://sourcebyte.vip/article/320.html