下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、fastjson序列化不包括轉(zhuǎn)義字符_java序列化知多少1 序列化概念多數(shù)伙伴肯定知道什么是序列化啦!也不我多說。序列化主要有兩個(gè)作:對(duì)象持久化和絡(luò)間傳輸。對(duì)象持久化例如,把對(duì)象轉(zhuǎn)換成進(jìn)制流寫到磁盤上。絡(luò)間傳輸,在rpc框架間的很泛。序列化:把對(duì)象編碼成進(jìn)制流的過程叫做序列化。反序列化:把對(duì)象進(jìn)制流轉(zhuǎn)換為對(duì)象的過程叫做反序列化。2 如何運(yùn)好序列化“如何運(yùn)好序列化”看到這個(gè)標(biāo)題你會(huì)很詫異,呵,這還不簡單,實(shí)現(xiàn)Serializable接不就完事了嗎,很難嗎?三年前我那會(huì)剛畢業(yè)出來找作的時(shí)候,試官問我你是如何實(shí)現(xiàn)序列化的,我:“這還不簡單嗎?實(shí)現(xiàn)Serializable接不就完了嗎?” 結(jié)果可想知
2、 。現(xiàn)在回想為什么我當(dāng)時(shí)會(huì)這樣認(rèn)為呢?多數(shù)情況下,是從數(shù)據(jù)庫查出數(shù)據(jù),轉(zhuǎn)換成VO返回到前端頁就完事了。VO類實(shí)現(xiàn)序列化,然后緩存到redis,在這種情況下,般來說是問題不的,因?yàn)槲覀兊腣O類等同于邏輯內(nèi)容,VO類基本上是些屬性值和get/set法,如名,機(jī)號(hào),地址等,這些屬性本來就是API接要提供的,所以暴露出去不成問題。實(shí)現(xiàn)序列化接的代價(jià):破壞了了對(duì)象的封裝性。如果我們只實(shí)現(xiàn)了Serializable接,類中的所有實(shí)例域都會(huì)被導(dǎo)出,包括私有的屬性,類設(shè)計(jì)的標(biāo)是“最低限度的訪問域”,類的些有的域?qū)υL問者是不可直接訪問的。增加了bug和出現(xiàn)安全漏洞的可能性。序列化機(jī)制是種語之外的的對(duì)象創(chuàng)建機(jī)制,
3、反序列化機(jī)制是個(gè)“隱藏的構(gòu)造器”,具備與其它構(gòu)造器相同的特點(diǎn)。java的默認(rèn)的序列化式碼流分龐,性能分差。java默認(rèn)的序列化式不持跨語和跨平臺(tái)。關(guān)于第三點(diǎn)和第四點(diǎn)以后再說。3 是否需要序列化的些準(zhǔn)則為了繼承設(shè)計(jì)的類,應(yīng)該盡可能的少實(shí)現(xiàn)Serializable接。如果類不是可序列化的,那么也法編寫可序列化的類。特別是,類在沒有提供參構(gòu)造器的情況下。- 在“允許類序列化”和“不允許類序列化”之間存在個(gè)折中的案,類提供個(gè)參的構(gòu)造器,由類決定是否實(shí)現(xiàn)序列化。3.1 為了繼承設(shè)計(jì)的類,應(yīng)該盡可能的少實(shí)現(xiàn) Serializable接為什么說“為了繼承設(shè)計(jì)的類,應(yīng)該盡可能的少實(shí)現(xiàn)Serializable接
4、”呢。如果類實(shí)現(xiàn)了序列化,那么類中的屬性也會(huì)被序列化,因此程序員在開發(fā)類的時(shí)候,就必須考慮哪些東西不該暴露出去,序列化會(huì)暴露對(duì)象內(nèi)部的實(shí)例域,包括私有的實(shí)例域,因此這會(huì)增加開發(fā)員的負(fù)擔(dān)。3.2 如果類不是可序列化的,那么也法編寫可序列化的類。特別是,類在沒有提供參構(gòu)造器的情況下?!叭绻惒皇强尚蛄谢模敲匆卜ň帉懣尚蛄谢念?。特別是,類在沒有提供參構(gòu)造器的情況下”。如果我們專為繼承實(shí)現(xiàn)了些類,這類需要類繼承并實(shí)現(xiàn),我們開發(fā)的類有序列化的要求,這是如果類不可序列化,那么我們法編寫可序列化的類,并不是說會(huì)報(bào)錯(cuò),是反序列化后類中的實(shí)例域都會(huì)丟失,只有在類沒有提供參構(gòu)造器的情況下,才會(huì)反序列化失敗報(bào)
5、錯(cuò)。以下代碼說明這情況:Parent是為了繼承設(shè)計(jì)的抽象類,需要類繼承該類并實(shí)現(xiàn)該類的抽象法(該例代碼中沒有體現(xiàn),也不需要),下的Parent類沒有實(shí)現(xiàn)序列化接,也就不是可序列化的,類的屬性在序列化的時(shí)候會(huì)丟失。public abstract class Parent private String name;private Date date;public Parent() = name;public Parent(String name) = name;pub下我們有個(gè)Child類,繼承了抽象類Parent,實(shí)現(xiàn)了類的些法以滿需求(該類并沒有也不需要體現(xiàn),我們的主要關(guān)注點(diǎn)在序列化上)。pub
6、lic class Child extends Parent implements Serializable private static final long serialVersionUID = 1L; private String sex; Override public Strin運(yùn)結(jié)果:3.2 運(yùn)結(jié)果可以看到類實(shí)例域相關(guān)的值都是空的,如果我們的類實(shí)現(xiàn)過程中依賴于這些狀態(tài)值,但取不到值,那么僅類序列化是意義的。假如我們?nèi)サ纛惖膮?gòu)造器,盡管類調(diào)的是類的有參構(gòu)造器,反序列化也不會(huì)成功,運(yùn)時(shí)會(huì)報(bào)InvalidClassException異常,提沒有有效的構(gòu)造器??諛?gòu)造器情況下報(bào)錯(cuò)3.3 在
7、允許類序列化 和不允許類序列化 的折中案基于3.1和3.2的討論,我們?cè)谠O(shè)計(jì)抽象類的時(shí)候,并不確定類需不要序列化,因此通常我們需要提供參的構(gòu)造器,由類決定時(shí)候需要序列化,類如果需要序列化,所做的作只是實(shí)現(xiàn)Serialible接,編寫readObject 和writeObject法,視情況決定需要序列化或者反序列化哪些屬性。例代碼:public class Child extends Parent implements Serializable private static final long serialVersionUID = 1L; private String sex;/ 3.2相多了
8、這個(gè)法 priva運(yùn)結(jié)果:3.3 運(yùn)結(jié)果可以看到相3.2,反序列化之后,name和date實(shí)例域也是有值的。4 序列化安全性問題4.1 序列化規(guī)范在探討如何保證序列化安全性問題之前,我們先看個(gè)例。在演這個(gè)例之前,我還得介紹些關(guān)于序列化協(xié)議的知識(shí)。如何讓你來從底層實(shí)現(xiàn)序列化協(xié)議,那么你肯定會(huì)考慮如何去描述個(gè)對(duì)象,需要有種基礎(chǔ)結(jié)構(gòu)描述對(duì)象的類,如果是動(dòng)態(tài)代理類如何處理、對(duì)象的屬性、對(duì)象的引、引類型、空對(duì)象如何描述、循環(huán)引怎么處理,重復(fù)引某個(gè)對(duì)象怎么處理等等,這些東西還是很復(fù)雜的。JDK官有套序列化語法規(guī)則:stream: magic version contentscontents: conten
9、t contents contentcontent: object blockdataobject: newObject newClass newArray newString newEnu備注: 如何看懂這套語法圖呢?先冒號(hào)左邊的是解釋說明,右邊的才是流的內(nèi)容,看懂這副語法圖,我們需要遞歸的思維去看,如在語法樹開頭部分我們讀到了“magic”,那么我們繼續(xù)向下搜索“maigic”,直到找到終端標(biāo)志(可以理解為語法規(guī)則的常量)為,在這我們讀到STREAM_MAGICz終端標(biāo)志,查看終端標(biāo)志表,發(fā)現(xiàn)是magic魔數(shù),聲明使序列化協(xié)議,沒有太含義,就跟class件以CAFEBABY開頭樣。所有的終
10、端標(biāo)志如下:final static short STREAM_MAGIC = (short)0 xaced; final static short STREAM_VERSION = 5; final static byte TC_NULL = (byte)0 x70; final static byte例:public class List implements java.io.Serializable int value;List next;public static void main(String args) try List list1 = new List();List list2
11、 = new List();list1打開件1.txt:aced 0005 7372 0012 636f 6d2e 6769 6d632e74 6573 742e 4c69 7374 4127 d6e5 a5d05a8d 0200 0249 0005 7661 6c75 654c 00046e65 7874 7400 1444.2演廢話不多說,現(xiàn)在演安全性攻擊問題:Parent:這是我們類實(shí)現(xiàn)了序列化接 包含name屬性和date屬性public class Parent implements Serializable private String name;private Date date
12、;/ / protected get/set/set dateprivapublic class Child extends Parent implements Serializable private static final long serialVersionUID = 1L;private String sex; / get/setpublic Child()Child是我們類繼承Parent并且實(shí)現(xiàn)了序列化接,main法中先我們構(gòu)造了合法的字節(jié)流,接著我們偽造字節(jié)流,插“0 x71,0,0 x7e, 0,6”,查詢語法表可知,0 x71 含義如下:prevObject TC_REFE
13、RENCE (int)handle代表這是個(gè)引,指向之前的個(gè)對(duì)象,為了能夠便的找到之前的對(duì)象,序列化引了handle的概念,類似于句柄,handle是32位的整型,通過該值能夠迅速找到之前的對(duì)象,handle起始值必須從0 x7E0000 開始。在這個(gè)例中我們的handle值是0 x007e0006,可以理解為引的是第六號(hào)“對(duì)象”,這的“對(duì)象”不完全是域?qū)ο螅仓复驅(qū)ο蟮拿枋龇?,如“Ljava/lang/String”。A basic structure is needed to represent objects in a stream. Each attribute of the obj
14、ect needs to be represented: itsclasses, its fields, and data written and later read by class-specific methods. The representation of objects in the stream canbe described with a grammar. There are special representations for null objects, new objects, classes, arrays, strings, andback references to
15、 any object already in the stream. Each object written to the stream is assigned a handle that is used torefer back to the object. Handles are assigned sequentially starting from 0 x7E0000. The handles restart at 0 x7E0000 whenthe stream is reset.運(yùn)結(jié)果:: Childsex=, name=, date=Sat May 23 15:39:25 GMT+
16、08:00 2020 : Childsex=, name=,查看運(yùn)結(jié)果可以清楚的看到,通過偽造流,我們拿到了對(duì)象的私有域,并且改變了私有域的狀態(tài),date本應(yīng)該是2020年的,卻被我們強(qiáng)改造為2010年,這是很嚴(yán)重的安全問題。要解決這個(gè)問題也很簡單,在Parent類編寫保護(hù)性的readObject()法。private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException inputStream.defaultReadObject();date = new Date改造
17、后的運(yùn)結(jié)果:: Childsex=, name=, date=Sat May 23 15:44:33 GMT+08:00 2020 : Childsex=, name=,5關(guān)于序列化的安全性問題建議5.1反序列化時(shí)候別忘記校驗(yàn)對(duì)象的有效性當(dāng)我們反序列化的時(shí)候,會(huì)從對(duì)象流讀取字節(jié)碼,構(gòu)造新的對(duì)象,因此反序列化的時(shí)候,我們也要保證反序列化的對(duì)象和正常new出來的對(duì)象具有相同的約束,這樣做的的是防篡改過的流成功反序列化成“不合法”的對(duì)象,通常這樣的對(duì)象的內(nèi)部狀態(tài)并不是我們期望的。因此,在readObject()法,我們需要?jiǎng)有r?yàn)對(duì)象的狀態(tài)是否合法。如果有效性校驗(yàn)失敗,我們需要果斷拋出InvalidO
18、bjectException。5.2 readObject法的保護(hù)性如果你覺得校驗(yàn)了對(duì)象的有效性,就可以規(guī)避安全問題,那么你就錯(cuò)了,如上所述4.25.3強(qiáng)烈建議不要序列化內(nèi)部類 即靜態(tài)成員類的嵌套類 )因?yàn)樵陟o態(tài)上下中聲明的內(nèi)部類包含對(duì)封閉類實(shí)例的隱式瞬態(tài)引,所以序列化此類內(nèi)部類實(shí)例也將導(dǎo)致對(duì)其關(guān)聯(lián)的外部類實(shí)例進(jìn)序列化。由javac(或其他Java TM編譯器)成的于實(shí)現(xiàn)內(nèi)部類的合成字段取決于實(shí)現(xiàn),并且在編譯器之間可能有所不同。這些字段的差異可能會(huì)破壞兼容性,并導(dǎo)致默認(rèn)沖突serialVersionUID價(jià)值觀。分配給本地和匿名內(nèi)部類的名稱也取決于實(shí)現(xiàn),并且在編譯器之間可能有所不同。由于內(nèi)部類不能聲明除編譯時(shí)常量字段以外的靜態(tài)成員,因此內(nèi)部類不能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四年級(jí)上冊(cè)口算和筆算題
- 實(shí)驗(yàn)小學(xué)二年級(jí)上學(xué)期口算練習(xí)題
- 標(biāo)準(zhǔn)預(yù)防及其措施
- 2024年七年級(jí)道德與法治下冊(cè)第十六課我與集體共成長復(fù)習(xí)提綱新人教版
- 八上18《中國石拱橋》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
- 上海興偉學(xué)院《光電類導(dǎo)論》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西2025年江西景德鎮(zhèn)學(xué)院引進(jìn)高層次人才66人筆試歷年參考題庫附帶答案詳解
- 巢湖學(xué)院《寶石資源及礦床》2023-2024學(xué)年第二學(xué)期期末試卷
- 未來智能駕駛與人工智能的融合趨勢(shì)
- 蘇州信息職業(yè)技術(shù)學(xué)院《建設(shè)監(jiān)理概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 快餐品牌全案推廣方案
- 華為員工股權(quán)激勵(lì)方案
- 衛(wèi)生院安全生產(chǎn)知識(shí)培訓(xùn)課件
- 口腔醫(yī)院感染預(yù)防與控制1
- 發(fā)生輸液反應(yīng)時(shí)的應(yīng)急預(yù)案及處理方法課件
- 中國旅游地理(高職)全套教學(xué)課件
- 門脈高壓性消化道出血的介入治療課件
- 民航保密培訓(xùn)課件
- 兒童尿道黏膜脫垂介紹演示培訓(xùn)課件
- 詩詞寫作入門
- 學(xué)校教育中的STEM教育模式培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論