摘要:現(xiàn)象項(xiàng)目組一妹子程序員求助,說有,有一個(gè)值明明設(shè)置的是,但是存到數(shù)據(jù)庫里面卻會(huì)自動(dòng)變成,嘗試了各種調(diào)整也找不原因,都快急瘋了我以前確實(shí)沒有研究過源碼,本著專研問題的精神,決定通過對(duì)一探究竟。
現(xiàn)象
??項(xiàng)目組一妹子程序員求助,說mybatis有bug,有一個(gè)值明明設(shè)置的是A.prop1=XXX,但是存到數(shù)據(jù)庫里面卻會(huì)自動(dòng)變成A.prop1=true,嘗試了各種調(diào)整也找不原因,都快急瘋了!我以前確實(shí)沒有研究過mybatis源碼,本著專(ba)研(mei)問(zhuang)題(b)的精神,決定通過debug對(duì)mybais一探究竟。
定位??debugDao的入口類便是org.apache.ibatis.binding.MapperProxy ,可以看到它實(shí)現(xiàn)了InvocationHandler,很明顯mybatis使用了jdk的動(dòng)態(tài)代理,參見查看我以前關(guān)于動(dòng)態(tài)代理類的培訓(xùn)ppt如下,那么它一定有地方使用了newProxyInstance生成代理類,果然在MapperProxyFactory中就可以找到對(duì)應(yīng)的方法,只不過這次動(dòng)態(tài)代理是對(duì)純接口進(jìn)行代理,而不是對(duì)實(shí)現(xiàn)類代理(當(dāng)然滿足動(dòng)態(tài)代理中被代理類需要實(shí)現(xiàn)接口的要求了?。?br>
??進(jìn)入到MapperMethod中的execute方法,可以看到mybatis對(duì)select、update、delete、insert有不同的分支處理:
??進(jìn)入到出問題的update方法中,可以定位到sqlSession.update執(zhí)行時(shí)修改了傳入的參數(shù)值,把XXX改成了true,這個(gè)update方法到底藏了什么玄機(jī)?繼續(xù)進(jìn)入,發(fā)現(xiàn)sqlSession也是spring sessionTemplate生成的一個(gè)動(dòng)態(tài)代理,主要是增加獲取鏈接和事物操作,通過代理層的操作,進(jìn)入Mybatis的DefaultSqlSession中,接下來就是Mybatis預(yù)編譯要?jiǎng)討B(tài)生成sql語句了,在動(dòng)態(tài)生成語句時(shí)終于最終定位到了罪魁禍?zhǔn)譱fSqlNode.apply方法(整體調(diào)用棧見下圖)!
??mybatis中會(huì)根據(jù)mapper文件生成一個(gè)SqlNodeTree,然后根據(jù)入?yún)⒌臄?shù)據(jù)有選擇的生成最終的SQL,例如mapper文件中支持
??進(jìn)入到具體的判斷方法內(nèi)部,發(fā)現(xiàn)了原來這邊判斷if test是使用的Ognl表達(dá)式引擎啊,Ognl是一個(gè)功能非常強(qiáng)大的JAVA表達(dá)式引擎,但是由于過于強(qiáng)大了,導(dǎo)致使用它的Struts2漏洞漫天飛,你Http請(qǐng)求中傳參"Runtime.getRuntime.exec("shutdown")",它真的就給你執(zhí)行關(guān)機(jī)了你敢信!!。
/* */ public boolean evaluateBoolean(String expression, Object parameterObject) /* */ { /* 29 */ Object value = OgnlCache.getValue(expression, parameterObject); /* 30 */ if (value instanceof Boolean) return ((Boolean)value).booleanValue(); /* 31 */ if (value instanceof Number) return (!(new BigDecimal(String.valueOf(value)).equals(BigDecimal.ZERO))); /* 32 */ return (value != null); /* */ }
??敏銳的我對(duì)著expression看了一遍又一遍,突然,我眼花了么?
A.prop1=!null ! A.prop1=!null !! A.prop1=!null !!!
??你妹啊! "!="寫成了"=!"!ognl又一次立功了,在需要它判斷的時(shí)候,它忠實(shí)的執(zhí)行了賦值(怪OGNL不怪妹子是幾個(gè)意思?),修改了mapper文件中的錯(cuò)誤,終于恢復(fù)了正常!
擴(kuò)展??上網(wǎng)搜索下看看有沒有犯同樣錯(cuò)誤的同學(xué),沒想到還真有人在mybatis中這樣玩OGNL的,根據(jù)if test判斷的結(jié)果給table名賦值,無疑是提供了一種嶄(hun)新(luan)的思路??!
??給你們這些挖坑的跪了!
select from ${dynamicTableName }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77210.html
摘要:支持的語法用于解析靜態(tài)方法解析表達(dá)式在映射語句中可以支持引入以下幾種方式示例變量屬性靜態(tài)方法無參數(shù)待參數(shù)靜態(tài)屬性數(shù)組索引集合構(gòu)造方法的靜態(tài)方法可以省略的編寫,方法的默認(rèn)是包下的靜態(tài)方法可以省略的編寫,類默認(rèn)的是語法中通過兩個(gè)字符,前者 Mybatis支持OGNL的語法 OgnlCache 用于解析靜態(tài)方法org.apache.ibatis.scripting.xmltags.TextS...
摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個(gè)對(duì)象,每個(gè)對(duì)象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進(jìn)來的參數(shù)數(shù)據(jù) ${}對(duì)傳遞進(jìn)來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...
摘要:?jiǎn)栴}描述最近通知應(yīng)用在近三個(gè)月內(nèi)出現(xiàn)過次緩存的問題,第一次在重啟之后一直沒有出現(xiàn)過問題,所以也沒有去重視,但是最近又出現(xiàn)過一次,看來很有必要徹底排查一次具體的錯(cuò)誤日志如下具體表現(xiàn)就是出現(xiàn)此異常之后連續(xù)的出現(xiàn)大量此異常 問題描述最近通知應(yīng)用在近三個(gè)月內(nèi)出現(xiàn)過2次DNS緩存的問題,第一次在重啟之后一直沒有出現(xiàn)過問題,所以也沒有去重視,但是最近又出現(xiàn)過一次,看來很有必要徹底排查一次;具體的錯(cuò)...
摘要:在軟件世界里,觀察意味著設(shè)置斷點(diǎn)添加調(diào)試語句監(jiān)視程序值以及檢查內(nèi)存在醫(yī)學(xué)領(lǐng)域,需要測(cè)試血樣和進(jìn)行光透視。福爾摩斯,最后一案如果你不修復(fù),它不會(huì)自動(dòng)消失。修復(fù)解決問題的能力,是軟件工程師的核心競(jìng)爭(zhēng)力之一。 這篇文章是《調(diào)試九法:軟硬件錯(cuò)誤的排查之道》的閱讀筆記。這本書的主旨,是介紹如何修復(fù)bug:找出bug發(fā)生的原因、并給出修復(fù)方案。 調(diào)試bug的九個(gè)規(guī)則列舉如下,建議將這個(gè)清單打印出來...
摘要:核心包包名稱包內(nèi)內(nèi)容簡(jiǎn)介注解目錄。如等類的實(shí)例反射生成工具目錄主要是注解,和的構(gòu)造器及轉(zhuǎn)換器內(nèi)部緩存接口。等默認(rèn)的游標(biāo)處理類數(shù)據(jù)源工廠類及實(shí)現(xiàn)。數(shù)據(jù)源實(shí)現(xiàn)類自定義的三個(gè)異常類。。都繼承自執(zhí)行器相關(guān)包。為后續(xù)分析源碼打下基礎(chǔ)。 Mybatis核心包 showImg(https://segmentfault.com/img/remote/1460000018747383?w=746&h=1...
閱讀 923·2021-11-25 09:44
閱讀 1171·2021-11-19 09:40
閱讀 7389·2021-09-07 10:23
閱讀 2051·2019-08-28 17:51
閱讀 1193·2019-08-26 10:59
閱讀 1993·2019-08-26 10:25
閱讀 3258·2019-08-23 18:22
閱讀 935·2019-08-23 16:58