成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一次mybatis中ognl引發(fā)的bug排查

RichardXG / 2444人閱讀

摘要:現(xiàn)象項目組一妹子程序員求助,說有,有一個值明明設(shè)置的是,但是存到數(shù)據(jù)庫里面卻會自動變成,嘗試了各種調(diào)整也找不原因,都快急瘋了我以前確實沒有研究過源碼,本著專研問題的精神,決定通過對一探究竟。

現(xiàn)象

??項目組一妹子程序員求助,說mybatis有bug,有一個值明明設(shè)置的是A.prop1=XXX,但是存到數(shù)據(jù)庫里面卻會自動變成A.prop1=true,嘗試了各種調(diào)整也找不原因,都快急瘋了!我以前確實沒有研究過mybatis源碼,本著專(ba)研(mei)問(zhuang)題(b)的精神,決定通過debug對mybais一探究竟。

定位

??debugDao的入口類便是org.apache.ibatis.binding.MapperProxy ,可以看到它實現(xiàn)了InvocationHandler,很明顯mybatis使用了jdk的動態(tài)代理,參見查看我以前關(guān)于動態(tài)代理類的培訓(xùn)ppt如下,那么它一定有地方使用了newProxyInstance生成代理類,果然在MapperProxyFactory中就可以找到對應(yīng)的方法,只不過這次動態(tài)代理是對純接口進行代理,而不是對實現(xiàn)類代理(當(dāng)然滿足動態(tài)代理中被代理類需要實現(xiàn)接口的要求了?。?br>
??進入到MapperMethod中的execute方法,可以看到mybatis對select、update、delete、insert有不同的分支處理:

??進入到出問題的update方法中,可以定位到sqlSession.update執(zhí)行時修改了傳入的參數(shù)值,把XXX改成了true,這個update方法到底藏了什么玄機?繼續(xù)進入,發(fā)現(xiàn)sqlSession也是spring sessionTemplate生成的一個動態(tài)代理,主要是增加獲取鏈接和事物操作,通過代理層的操作,進入Mybatis的DefaultSqlSession中,接下來就是Mybatis預(yù)編譯要動態(tài)生成sql語句了,在動態(tài)生成語句時終于最終定位到了罪魁禍?zhǔn)譱fSqlNode.apply方法(整體調(diào)用棧見下圖)!

解決

??mybatis中會根據(jù)mapper文件生成一個SqlNodeTree,然后根據(jù)入?yún)⒌臄?shù)據(jù)有選擇的生成最終的SQL,例如mapper文件中支持語法,if test的條件動態(tài)決定update或者where的sql語句是否存在,例如傳過來的A對象中沒有prop1屬性,那么if test A.prop1!=null判斷一下,如果沒有的話,最終的sql就不包含update prop1=?,達到靈活和提高性能的目的。這個ifSqlNode就是mapper if test語法的具體Node,但是這個node應(yīng)該只是判斷是否存在這個條件啊!怎么會改值的?
??進入到具體的判斷方法內(nèi)部,發(fā)現(xiàn)了原來這邊判斷if test是使用的Ognl表達式引擎啊,Ognl是一個功能非常強大的JAVA表達式引擎,但是由于過于強大了,導(dǎo)致使用它的Struts2漏洞漫天飛,你Http請求中傳參"Runtime.getRuntime.exec("shutdown")",它真的就給你執(zhí)行關(guān)機了你敢信!!。

/*    */   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);
/*    */   }

??敏銳的我對著expression看了一遍又一遍,突然,我眼花了么?

A.prop1=!null !
A.prop1=!null !!
A.prop1=!null !!!

??你妹啊! "!="寫成了"=!"!ognl又一次立功了,在需要它判斷的時候,它忠實的執(zhí)行了賦值(怪OGNL不怪妹子是幾個意思?),修改了mapper文件中的錯誤,終于恢復(fù)了正常!

擴展

??上網(wǎng)搜索下看看有沒有犯同樣錯誤的同學(xué),沒想到還真有人在mybatis中這樣玩OGNL的,根據(jù)if test判斷的結(jié)果給table名賦值,無疑是提供了一種嶄(hun)新(luan)的思路?。?br>??給你們這些挖坑的跪了!


            select from ${dynamicTableName }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77210.html

相關(guān)文章

  • MyBatis支持OGNL語法

    摘要:支持的語法用于解析靜態(tài)方法解析表達式在映射語句中可以支持引入以下幾種方式示例變量屬性靜態(tài)方法無參數(shù)待參數(shù)靜態(tài)屬性數(shù)組索引集合構(gòu)造方法的靜態(tài)方法可以省略的編寫,方法的默認(rèn)是包下的靜態(tài)方法可以省略的編寫,類默認(rèn)的是語法中通過兩個字符,前者 Mybatis支持OGNL的語法 OgnlCache 用于解析靜態(tài)方法org.apache.ibatis.scripting.xmltags.TextS...

    wh469012917 評論0 收藏0
  • Mybatis常見面試題

    摘要:執(zhí)行沒有,批處理不支持,將所有都添加到批處理中,等待統(tǒng)一執(zhí)行,它緩存了多個對象,每個對象都是完畢后,等待逐一執(zhí)行批處理。 Mybatis常見面試題 #{}和${}的區(qū)別是什么? #{}和${}的區(qū)別是什么? 在Mybatis中,有兩種占位符 #{}解析傳遞進來的參數(shù)數(shù)據(jù) ${}對傳遞進來的參數(shù)原樣拼接在SQL中 #{}是預(yù)編譯處理,${}是字符串替換。 使用#{}可以有效的防止...

    liuchengxu 評論0 收藏0
  • 一次排查多線程引發(fā)Java DNS緩存Bug

    摘要:問題描述最近通知應(yīng)用在近三個月內(nèi)出現(xiàn)過次緩存的問題,第一次在重啟之后一直沒有出現(xiàn)過問題,所以也沒有去重視,但是最近又出現(xiàn)過一次,看來很有必要徹底排查一次具體的錯誤日志如下具體表現(xiàn)就是出現(xiàn)此異常之后連續(xù)的出現(xiàn)大量此異常 問題描述最近通知應(yīng)用在近三個月內(nèi)出現(xiàn)過2次DNS緩存的問題,第一次在重啟之后一直沒有出現(xiàn)過問題,所以也沒有去重視,但是最近又出現(xiàn)過一次,看來很有必要徹底排查一次;具體的錯...

    cocopeak 評論0 收藏0
  • 筆記|軟件調(diào)試技巧

    摘要:在軟件世界里,觀察意味著設(shè)置斷點添加調(diào)試語句監(jiān)視程序值以及檢查內(nèi)存在醫(yī)學(xué)領(lǐng)域,需要測試血樣和進行光透視。福爾摩斯,最后一案如果你不修復(fù),它不會自動消失。修復(fù)解決問題的能力,是軟件工程師的核心競爭力之一。 這篇文章是《調(diào)試九法:軟硬件錯誤的排查之道》的閱讀筆記。這本書的主旨,是介紹如何修復(fù)bug:找出bug發(fā)生的原因、并給出修復(fù)方案。 調(diào)試bug的九個規(guī)則列舉如下,建議將這個清單打印出來...

    DirtyMind 評論0 收藏0
  • Mybatis源碼分析(1) - Mybatis包目錄簡介

    摘要:核心包包名稱包內(nèi)內(nèi)容簡介注解目錄。如等類的實例反射生成工具目錄主要是注解,和的構(gòu)造器及轉(zhuǎn)換器內(nèi)部緩存接口。等默認(rèn)的游標(biāo)處理類數(shù)據(jù)源工廠類及實現(xiàn)。數(shù)據(jù)源實現(xiàn)類自定義的三個異常類。。都繼承自執(zhí)行器相關(guān)包。為后續(xù)分析源碼打下基礎(chǔ)。 Mybatis核心包 showImg(https://segmentfault.com/img/remote/1460000018747383?w=746&h=1...

    chengtao1633 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<