程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java耐久層框架mybatis避免sql注入的辦法

java耐久層框架mybatis避免sql注入的辦法

編輯:關於JAVA

java耐久層框架mybatis避免sql注入的辦法。本站提示廣大學習愛好者:(java耐久層框架mybatis避免sql注入的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java耐久層框架mybatis避免sql注入的辦法正文


sql注入年夜家都不生疏,是一種罕見的進擊方法,進擊者在界面的表單信息或url上輸出一些奇異的sql片斷,例如“or ‘1'='1'”如許的語句,有能夠入侵參數校驗缺乏的運用法式。所以在我們的運用中須要做一些任務,來戒備如許的進擊方法。在一些平安性很高的運用中,好比銀行軟件,常常應用將sql語句全體調換為存儲進程如許的方法,來避免sql注入,這固然是一種很平安的方法,但我們日常平凡開辟中,能夠不須要這類逝世板的方法。

mybatis框架作為一款半主動化的耐久層框架,其sql語句都要我們本身來手動編寫,這個時刻固然須要避免sql注入。其實Mybatis的sql是一個具有“輸出+輸入”功效,相似於函數的構造,以下:

<select id=“getBlogById“ resultType=“Blog“ parameterType=”int”><br>
    select id,title,author,content from blog where id=#{id}
 
</select>

這裡,parameterType標示了輸出的參數類型,resultType標示了輸入的參數類型。回應上文,假如我們想避免sql注入,天經地義地要在輸出參數高低工夫。下面代碼中高亮部門即輸出參數在sql中拼接的部門,傳入參數後,打印出履行的sql語句,會看到sql是如許的:

select id,title,author,content from blog where id = ?

不論輸出甚麼參數,打印出的sql都是如許的。這是由於mybatis啟用了預編譯功效,在sql履行前,會先將下面的sql發送給數據庫停止編譯,履行時,直接應用編譯好的sql,調換占位符“?”便可以了。由於sql注入只能對編譯進程起感化,所以如許的方法就很好地防止了sql注入的成績。

mybatis是若何做到sql預編譯的呢?其其實框架底層,是jdbc中的PreparedStatement類在起感化,PreparedStatement是我們很熟習的Statement的子類,它的對象包括了編譯好的sql語句。這類“預備好”的方法不只能進步平安性,並且在屢次履行一個sql時,可以或許進步效力,緣由是sql已編譯好,再次履行時無需再編譯。

話說回來,能否我們應用mybatis就必定可以避免sql注入呢?固然不是,請看上面的代碼:

<select id=“orderBlog“ resultType=“Blog“ parameterType=”map”>
 
    select id,title,author,content from blog order by ${orderParam}
 
</select>

細心不雅察,內聯參數的格局由“#{xxx}”變成了${xxx}。假如我們給參數“orderParam”賦值為”id”,將sql打印出來,是如許的:

select id,title,author,content from blog order by id

明顯,如許是沒法阻攔sql注入的。在mybatis中,”${xxx}”如許格局的參數會直接介入sql編譯,從而不克不及防止注入進擊。但觸及到靜態表名和列名時,只能應用“${xxx}”如許的參數格局,所以,如許的參數須要我們在代碼中手工停止處置來避免注入。

結論:在編寫mybatis的映照語句時,盡可能采取“#{xxx}”如許的格局。若不能不應用“${xxx}”如許的參數,要手工地做好過濾任務,來避免sql注入進擊。

以上就是小編為年夜家帶來的java耐久層框架mybatis避免sql注入的辦法全體內容了,願望年夜家多多支撐~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved