1. 程式人生 > 其它 >mybatis的#與$的sql注入問題

mybatis的#與$的sql注入問題

#與$的區別

預設情況下,使用#{}格式的語法會導致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

二、通過pageHelper外掛進行排序。

總結:能用#就用#,儘量不要用$。