新聞中心
MyBatis怎么防止SQL注入?
用#{參數(shù)}進行預編譯就可以防止了,千萬別用${}這種方式注入?yún)?shù)。

創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站設計、網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元金州做網(wǎng)站,已為上家服務,為金州各地企業(yè)和個人服務,聯(lián)系電話:028-86922220
mybatis框架作為一款半自動化的持久層框架,其sql語句都要我們自己來手動編寫,這個時候當然需要防止sql注入。其實Mybatis的sql是一個具有“輸入+輸出”功能,類似于函數(shù)的結構,如下:
select id,title,author,content
from blog where id=#{id}
這里,parameterType標示了輸入的參數(shù)類型,resultType標示了輸出的參數(shù)類型?;貞衔?,如果我們想防止sql注入,理所當然地要在輸入?yún)?shù)上下功夫。上面代碼中高亮部分即輸入?yún)?shù)在sql中拼接的部分,傳入?yún)?shù)后,打印出執(zhí)行的sql語句,會看到sql是這樣的:
select id,title,author,content from blog where id = ?
不管輸入什么參數(shù),打印出的sql都是這樣的。這是因為mybatis啟用了預編譯功能,在sql執(zhí)行前,會先將上面的sql發(fā)送給數(shù)據(jù)庫進行編譯,執(zhí)行時,直接使用編譯好的sql,替換占位符“?”就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。
mybatis中兩個占位符的區(qū)別?
mybatis的占位符區(qū)別
一、占位符一:#{xxx}
PreparedStatement 預編譯sql語句有?占位符。 xxx表達式的寫法。
參數(shù)類型為javabean類, xxx表達式必須和javabean中屬性對應的get方法名字一樣。
如果 parameterType 傳輸單個簡單類型值,#{} 括號中可以是 value 或其它名稱。
二、占位符二: ¥{xxx}
Statement拼接 sql語句沒有? 占位符會有SQL注入的漏洞。xxx 表達式的寫法。
參數(shù)類型為javabean類, xxx 表達式必須和javabean中屬性對應的get方法名字一樣,
如果parameterType傳輸單個簡單類型值,{} 括號中只能是 value。
MySQL中怎么用sql寫一個自動增長的字符串,如:yt0001?
MySQL為例,現(xiàn)在項目大部分都用框架實現(xiàn),比如MyBatis框架,輕量級,功能強大:
在MyBatis中,如果寫${變量名},則為直接把傳入的值填充到SQL語句中;
如果寫#{變量名},則為傳入的值只能作為值,放到SQL語句中。
舉例:
DELETE FROM student WHERE name=${stu_name}
如果這樣寫,假如用戶惡意傳入這樣一個字符串:abc OR 1=1,那么整個SQL就變成了
DELETE FROM student WHERE name=abc OR 1=1,結果就是全部數(shù)據(jù)都刪掉了。
這就是SQL注入,如果把${stu_name}換成#{stu_name},那么依然傳入上面的字符串,那么SQL是這樣的:DELETE FROM student WHERE name=`abc OR 1=1`,會刪除名字為abc OR 1=1的學生,沒有這個學生則什么都刪除不掉,這樣就防止了SQL注入。
到此,以上就是小編對于mybatis 防注入的問題就介紹到這了,希望這3點解答對大家有用。
當前名稱:MyBatis怎么防止SQL注入?(mybatis如何防sql注入)
URL網(wǎng)址:http://www.5511xx.com/article/ccshjoh.html


咨詢
建站咨詢
