mybatis解決sql注入 MyBatis怎么防止SQL注入?
MyBatis怎么防止SQL注入?用#{參數(shù)}進(jìn)行預(yù)編譯就可以防止了,千萬(wàn)別用${}這種方式注入?yún)?shù)。mybatis框架作為一款半自動(dòng)化的持久層框架,其sql語(yǔ)句都要我們自己來(lái)手動(dòng)編寫,這個(gè)時(shí)候當(dāng)然需
MyBatis怎么防止SQL注入?
用#{參數(shù)}進(jìn)行預(yù)編譯就可以防止了,千萬(wàn)別用${}這種方式注入?yún)?shù)。
mybatis框架作為一款半自動(dòng)化的持久層框架,其sql語(yǔ)句都要我們自己來(lái)手動(dòng)編寫,這個(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中的#和$的區(qū)別,以及防止sql注入的方法?
#{ } 解析為一個(gè) JDBC 預(yù)編譯語(yǔ)句(prepared statement)的參數(shù)標(biāo)記符。
例如,sqlMap 中如下的 sql 語(yǔ)句
select * from user where name = #{name}
解析為:
select * from user where name = ?
一個(gè) #{ } 被解析為一個(gè)參數(shù)占位符 ? 。
${ } 僅僅為一個(gè)純碎的 string 替換,在動(dòng)態(tài) SQL 解析階段將會(huì)進(jìn)行變量替換
例如,sqlMap 中如下的 sql
select * from user where name = "${name}"
當(dāng)我們傳遞的參數(shù)為 "ruhua" 時(shí),上述 sql 的解析為:
select * from user where name = "ruhua"
預(yù)編譯之前的 SQL 語(yǔ)句已經(jīng)不包含變量 name 了。
綜上所得, ${ } 的變量的替換階段是在動(dòng)態(tài) SQL 解析階段,而 #{ }的變量的替換是在 DBMS 中。
注意:${ } 在預(yù)編譯之前已經(jīng)被變量替換了,這會(huì)存在 sql 注入問(wèn)題。
mybatis為什么可以防止sql注入?
因?yàn)樵趍ybatis中,”${xxx}”這樣格式的參數(shù)會(huì)直接參與sql編譯,從而不能避免注入攻擊。但涉及到動(dòng)態(tài)表名和列名時(shí),只能使用“${xxx}”這樣的參數(shù)格式,所以,這樣的參數(shù)需要程序開發(fā)者在代碼中手工進(jìn)行處理來(lái)防止注入。#xxx# 代表xxx是屬性值,map里面的key或者是你的pojo對(duì)象里面的屬性, ibatis會(huì)自動(dòng)在它的外面加上引號(hào),表現(xiàn)在sql語(yǔ)句是這樣的 where xxx = "xxx" $xxx$ 則是把xxx作為字符串拼接到sql語(yǔ)句中, 比如 order by topicId , 語(yǔ)句這樣寫 ... order by #xxx# ibatis 就會(huì)翻譯成order by "topicId" (這樣就會(huì)報(bào)錯(cuò)) 語(yǔ)句這樣寫 ... order by $xxx$ ibatis 就會(huì)翻譯成 order by topicId
淺談mybatis中的#和$的區(qū)別以及防止sql注入的方法?
Mybatis本身是基于JDBC封裝的。
#{para}是預(yù)編譯處理(PreparedStatement)范疇的。
${para}是字符串替換。
Mybatis在處理#時(shí),會(huì)調(diào)用PreparedStatement的set系列方法來(lái)賦值;處理$時(shí),就是把${para}替換成變量的值。
使用#{para}可以有效的防止SQL注入,提高系統(tǒng)安全性。