下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第java安全fastjson1.2.24反序列化TemplatesImpl分析if(fieldDeserializer==null){
for(FieldDeserializerfieldDeser:sortedFieldDeserializers){
if(fieldDeser.fieldI.equalsIgnoreCase(key2)){
fieldDeserializer=fieldDeser;
break;
//省略部分代碼......
}
我們貌似...大概知道了getOutputProperties方法是如何獲取的,繼續(xù)思考一下:fastjson在反序列化過(guò)程中具體是如何調(diào)用屬性的getter方法的?
答案是JavaBeanInfo類中有一個(gè)build方法,當(dāng)通過(guò)@type獲取TemplatesImpl類的calss對(duì)象后,會(huì)通過(guò)反射獲取該類的class對(duì)象的所有方法并封裝到Method數(shù)組中。然后通過(guò)for循環(huán)遍歷Method獲取getter方法,并將outputProperties屬性和getter方法(getOutputProperties方法)一起封裝到FieldInfo,從代碼中確實(shí)可以看到add方法會(huì)將FieldInfo放到了一個(gè)fieldList中,然后將fieldList封裝到JavaBeanInfo
getter方法的查找方式需要滿足以下幾個(gè)條件:
方法名長(zhǎng)度不小于4
必須是非靜態(tài)方法
必須get字符串開(kāi)頭,并且第四個(gè)字符為大寫(xiě)字母
方法中不能有參數(shù)
返回值繼承自Collection||Map||AtomicBoolean||AtomicInteger||AtomicLong
在getter方法中不能有setter方法
這樣一來(lái)自然就獲取到了getOutputProperties()方法,當(dāng)setValue方法從FieldInfo獲取到outputProperties屬性和getOutputProperties方法并反射調(diào)用getOutputProperties方法就會(huì)觸發(fā)TemplatesImpl利用鏈。
getOutputProperties方法內(nèi)部調(diào)用了newTransformer方法
publicsynchronizedPropertiesgetOutputProperties(){
try{
//調(diào)用newTransformer方法
returnnewTransformer().getOutputProperties();
catch(TransformerConfigurationExceptione){
returnnull;
}
newTransformer方法內(nèi)部調(diào)用了getTransletInstance方法
publicsynchronizedTransformernewTransformer()throwsTransformerConfigurationException{
TransformerImpltransformer;
//調(diào)用了getTransletInstance方法
transformer=newTransformerImpl(getTransletInstance(),_outputProperties,
_indentNumber,_tfactory);
if(_uriResolver!=null){
transformer.setURIResolver(_uriResolver);
if(_tfactory.getFeature(XMLConstants.FEATURE_SECURE_PROCESSING)){
transformer.setSecureProcessing(true);
returntransformer;
}
getTransletInstance方法內(nèi)部會(huì)對(duì)_name和_class進(jìn)行不為null校驗(yàn),我們構(gòu)造的payload沒(méi)有_class,因此這里_class為null會(huì)調(diào)用defineTransletClasses方法加載_bytecodes屬性的類字節(jié)碼(加載TempletaPoc類)。
privateTransletgetTransletInstance()throwsTransformerConfigurationException{
try{
if(_name==null)returnnull;
//調(diào)用defineTransletClasses方法
if(_class==null)defineTransletClasses();
//根據(jù)_class實(shí)例化類
AbstractTranslettranslet=(AbstractTranslet)_class[_transletIndex].newInstance();
}
跟進(jìn)defineTransletClasses方法:
privatevoiddefineTransletClasses()throwsTransformerConfigurationException{
//校驗(yàn)_bytecodes
if(_bytecodes==null){
ErrorMsgerr=newErrorMsg(ErrorMsg.NO_TRANSLET_CLASS_ERR);
thrownewTransformerConfigurationException(err.toString());
TransletClassLoaderloader=(TransletClassLoader)
AccessController.doPrivileged(newPrivilegedAction(){
publicObjectrun(){
//通過(guò)_tfactory調(diào)用getExternalExtensionsMap方法
returnnewTransletClassLoader(ObjectFactory.findClassLoader(),_tfactory.getExternalExtensionsMap());
try{
finalintclassCount=_bytecodes.length;
_class=newClass[classCount];
if(classCount1){
_auxClasses=newHashtable();
for(inti=0;iclassCount;i++){
//加載_bytecodes中的類(TempletaPoc)
_class[i]=loader.defineClass(_bytecodes[i]);
//獲取TempletaPoc的父類
finalClasssuperClass=_class[i].getSuperclass();
//Checkifthisisthemainclass
//是否繼承了AbstractTranslet類
if(superClass.getName().equals(ABSTRACT_TRANSLET)){
_transletIndex=i;
else{
_auxClasses.put(_class[i].getName(),_class[i]);
if(_transletIndex0){
ErrorMsgerr=newErrorMsg(ErrorMsg.NO_MAIN_TRANSLET_ERR,_name);
thrownewTransformerConfigurationException(err.toString());
catch(ClassFormatErrore){
ErrorMsgerr=newErrorMsg(ErrorMsg.TRANSLET_CLASS_ERR,_name);
thrownewTransformerConfigurationException(err.toString());
catch(LinkageErrore){
ErrorMsgerr=newErrorMsg(ErrorMsg.TRANSLET_OBJECT_ERR,_name);
thrownewTransformerConfigurationExce
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術(shù)要領(lǐng):網(wǎng)站性能優(yōu)化關(guān)鍵點(diǎn)
- 2026年公共關(guān)系管理情境模擬題媒體溝通策略題目
- 2026年審計(jì)專業(yè)認(rèn)證試題GJB與ISO雙重標(biāo)準(zhǔn)下的審計(jì)題
- 2026年綠色能源市場(chǎng)與投資策略試題集
- 2026年烹飪技能競(jìng)賽經(jīng)典菜肴制作標(biāo)準(zhǔn)題
- 2026年會(huì)員營(yíng)銷(xiāo)策略有效性測(cè)試題
- 2026年測(cè)試工程師基礎(chǔ)知識(shí)與進(jìn)階知識(shí)測(cè)試題
- 2026年外語(yǔ)翻譯技能與教學(xué)方法試題集
- 2026年建筑師執(zhí)業(yè)資格考試題庫(kù)建筑設(shè)計(jì)與實(shí)踐操作指南
- 2025 小學(xué)二年級(jí)道德與法治上冊(cè)友好交流使用禮貌用語(yǔ)對(duì)話更和諧更有禮課件
- 深圳大疆在線測(cè)評(píng)行測(cè)題庫(kù)
- 金屬?gòu)S生產(chǎn)制度
- 2026安徽淮北市特種設(shè)備監(jiān)督檢驗(yàn)中心招聘專業(yè)技術(shù)人員4人參考題庫(kù)及答案1套
- 2025年航空行業(yè)空客智能制造報(bào)告
- 蒙牛乳業(yè)股份有限公司盈利能力分析
- 2025民航西藏空管中心社會(huì)招聘14人(第1期)筆試參考題庫(kù)附帶答案詳解(3卷合一版)
- (新教材)2026年人教版八年級(jí)下冊(cè)數(shù)學(xué) 21.2.1 平行四邊形及其性質(zhì) 課件
- 設(shè)備保養(yǎng)維護(hù)規(guī)程
- 2025年?yáng)|營(yíng)中考物理真題及答案
- DL-T+5860-2023+電化學(xué)儲(chǔ)能電站可行性研究報(bào)告內(nèi)容深度規(guī)定
- GB/T 46425-2025煤矸石山生態(tài)修復(fù)技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論