能夠有效的防止sql注入?
用#{參數(shù)}進(jìn)行預(yù)編譯就可以防止了,千萬(wàn)別用${}這種方式注入?yún)?shù)。
Mybatis框架作為一款半自動(dòng)化的持久層框架,其sql語(yǔ)句都要我們自己來(lái)手動(dòng)編寫(xiě),這個(gè)時(shí)候當(dāng)然需要防止sql注入。其實(shí)Mybatis的sql是一個(gè)具有“輸入+輸出”功能,類(lèi)似于函數(shù)的結(jié)構(gòu),如下:
select id,title,author,content
from blog where id=#{id}
這里,parameterType標(biāo)示了輸入的參數(shù)類(lèi)型,resultType標(biāo)示了輸出的參數(shù)類(lèi)型。回應(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)題。