Mybatis中的#{}與${}區別以及什麼是SQL注入
今天搞懂了一個問題,就是在使用Mybatis時#{}與${}到底有什麼區別?原來也看過別人的部落格,感覺總是迷迷糊糊(原諒我是菜鳥),今天把這個問題整理了一遍,水平有限,各位大佬如果發現錯誤的地方請指正
1,首先Mybatis中的#{}與${}到底有什麼區別?
其實,區別就是如果使用#{},會將{}裡面的傳入的值自動解析成為帶引號的值,比如:
select count(1) from t_user where user_name = #{userName} and user_password = #{userPassword}
假如,此時傳入userName傳入的值為admin,userPassword傳入的值為123456,那麼最後的sql就是:
select count(1) from t_user where user_name = 'admin' and user_password = '123456';
會解析成字串,而${}就會這樣解析:
select count(1) from t_user where user_name = admin and user_password = 123456;
顯然,這是一個錯誤的sql語句,那麼,什麼叫SQL注入呢?為什麼#{}可以有效的防止sql注入呢?
2,什麼是SQL注入?
SQL注入就是利用現有應用程式,將(惡意)的SQL命令注入到後臺資料庫執行一些惡意的操作
比如說,在登入過程中,利用上面的語句到資料庫中查詢使用者名稱/密碼是否存在,如果存在就登入成功
而如果不存在就登入失敗,如果說你後臺使用的是${},惡意使用者在表單中的使用者名稱文字框中輸入的是'admin'
密碼框中輸入的是' ' or 1 = 1 加了一引號和一個恆成立的條件,那麼,傳到資料庫中的sql就是:
select count(1) from t_user where user_name = 'admin' and user_password = ' ' or 1=1
如果程式沒有做其他的校驗,此時,該惡意使用者是可以登入系統的! 這就是SQL注入,惡意攻擊
而如果使用#{}是不會出現這種情況的,#{}預設會給輸入的值加上引號,但是使用#{}在其他場景下並不適用
比如要使用到排序 order by #{} 傳入的引數應是表對應欄位名,但是加上引號後就會解析成
order by 'age' 這樣就達不到排序的目的,而此時如果使用${}就可以達到排序的目的
即,sql解析成 order by age,根據age排序
只是瞭解皮毛,歡迎大佬們指教!