目錄
概述
#{} 與 ${}
概述
? ? ? ? 前端惡意傳參,改變后端 sql 語句的語法結構,從而使后端給前端返回一些私密的數據。這種安全問題往往是因為沒有嚴格過濾參數,或者后端代碼不嚴謹導致的。
#{} 與 ${}
? ? ? ? 在 MyBatis 框架中,#{} 與 ${} 都表示占位符,方便靈活傳參。如下代碼
@Select("select * from user_info where username= #{name} ")
UserInfo queryByName(String name);
????????#{} 使用的是 預編譯 sql , ${} 使用的是 及時 sql 。
????????及時 sql :sql 語句要先經過 詞法分析,語法分析,語義分析,再把優化后的 sql 喂給數據庫執行。
? ? ? ? 也就是說,${} 占位符傳過來的參數是要參與 sql 語法構建的,如果參數中帶有一些 sql 的關鍵字,會在詞法分析時被識別成 sql 的關鍵字。
? ? ? ? 預編譯 sql : 會把編譯好的 sql 緩存起來,當要使用該 sql 時,不會再進行?詞法分析,語法分析,語義分析。
? ? ? ? 如此一來,不僅提高了 sql 的執行效率,#{} 傳過來的參數不會參與 sql 的語法構建。
????????#{} 占位符會會根據類型,自動拼接 ' ' ,${} 會對參數直接進行替換,如果參數為字符串,需要加? ?' ' 號。如下代碼
@Select("select * from user_info whereusername= '${name}' ")
UserInfo queryByName(String name);
? ? ? ? 因為 #{} 占位符會拼接 '' 號,在一些 sql 中,并不需要加單引號,就必須使用 ${} 占位符。如下示例
@Select("select * from user_info order by id ${sort}")
public List<UserInfo> selectUserSortById(String sort);