mybatis的#與$的sql注入問題
阿新 • • 發佈:2021-08-05
#與$的區別
預設情況下,使用#{}格式的語法會導致MyBatis的建立的PreparedStatement引數並安全地設定引數(就像使用?一樣)。
這樣做更安全,更迅速,通常也是首選做法。
mybatis中在xml檔案編寫sql語句時,我們一般用到的是#
比如:select * from user where id = #{id}
這樣子做,預處理之後變為
select * from user where id = ?
然後將我們傳遞的id傳到“ ?”去。比如id為10,傳遞後就變為
select * from user where id = 10
但是,在進行order by 排序時,由於我們後面一般都是拼接欄位進行排序,所以要使用$
比如:select * from user order by ${param}
假如我們通過年齡排序,將age傳遞到語句中,就變為:
select * from user order by age
這樣子是成功的。但是$是有sql注入風險的,官方也不推薦使用$。
如果我們order by排序使用#,那麼#{param}就會使傳遞引數變為:
select * from user order by 'age'
多了兩個引號,這樣子將會導致排序失敗。
解決方案
一、通過增加一個sql防注入過濾器,解決$的sql注入安全問題。
詳情請點選這個連結:https://www.cnblogs.com/czfan/p/15039504.html