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

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


咨詢
建站咨詢
