防御sql注入的最佳方式 預(yù)編譯為什么能防止sql注入?
預(yù)編譯為什么能防止sql注入?因?yàn)閜reparedStatement中可以不包含數(shù)據(jù),只包含操作,這樣就不需要用數(shù)據(jù)來(lái)拼接SQL。淺談mybatis中的#和$的區(qū)別,以及防止sql注入的方法?#{ }
預(yù)編譯為什么能防止sql注入?
因?yàn)閜reparedStatement中可以不包含數(shù)據(jù),只包含操作,這樣就不需要用數(shù)據(jù)來(lái)拼接SQL。
淺談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)題。