mybatis字串轉義問題解決

2021-10-02 07:01:37 字數 1432 閱讀 6576

提前劇透:

如果引數中有. ?等特殊引數,需要使用${},但需要注意sql注入問題

@select("select * from account order by # # limit #,#")

public listgetaccountlist(@param("orderby") string orderby, @param("orderrule") string orderrule,

@param("start) int start, @param("offset") int offset);

如上**所示,在執行查詢操作時,為了能夠與前端聯動進行排序,直接在sql引數中傳遞排序欄位和排序規則。

但是,在除錯時偶然發現,當傳遞的「orderby」值為不存在的字段時,竟然不會報錯!!!

經過進一步除錯發現,實際上並不會按照預期的排序規則返回資料列表!!!

設定log4j的日誌級別為debug後發現,最終執行的sql語句是乙個預編譯操作,mybatis輸出日誌如下:

==> preparing: select * from account order by ? ? limit ?, ?

==> parameters: loginname(string), desc(string), 0(integer), 50(integer)

很顯然,傳遞的引數loginname和desc是作為字串處理的。

也就是說,很有可能mybatis對string型別的引數會進行轉換。舉個例子:傳遞的string引數為loginname,最終在sql語句執行時為:『loginname』。

再進一步驗證,如果在sql語句中傳遞的排序字段不是欄位名loginname,而是』loginname』時,是不會按照排序規則返回資料的,並且也不會報錯!

追溯mybatis官方文件發現:預設情況下,使用#{}格式的語法會導致mybatis對字串進行修改或轉義!!!

解決問題

將引數傳遞的語法格式#{}修改為${},即:

@select("select * from account order by $ $ limit #,#")

public listgetaccountlist(@param("orderby") string orderby, @param("orderrule") string orderrule,

@param("start) int start, @param("offset") int offset);

此時,對於使用${}格式引用的引數,mybatis直接在sql語句中插入乙個不改變的字串,而不再作為乙個預編譯引數處理。

注意: 以這種方式接收使用者輸入的內容並直接提供給sql語句作為不變的字串是不安全的,會導致潛在的sql注入攻擊,因此要麼不允許使用者輸入這些字段,要麼自行轉義並檢驗。

字串 轉義 反轉義

本人用wangeditor富文字外掛程式的時候 富文字的內容裡有鏈結 以及各種標籤 想存到資料庫中 出現了 特殊字元 json轉換錯誤 得把字串轉義一下存到後台 靠的就是這幾行 解決的問題 很有用 escapehtml就是把帶有html標籤以及特殊字元給轉義一下 傳給後台 存入資料庫 unescap...

字串 轉義字元 注釋

hello world 我是乙個好人 這種由雙引號引起來的一串字元稱為 字串的字面值 或者簡稱字串 字串的結束是乙個 0的轉義字元,在計算字串長度的時候 0是結束的標誌,不算作字串的內容 關於製表符 tab 製表符字如其名,就是讓你的程式或者文字的格式更加的整齊,他有自動對齊的功能 比如 a b b...

php字串。轉義字元

輸出時是雙引號時,變數會被解析。單引號包裹的 不識別變數名。在雙引號裡 變數名後緊跟乙個非空字元,會變數識別失敗。name 張三 echo 名字是 name 輸出 名字是 張三 echo 名字是 name 輸出 名字是 name echo 名字是 name 北京 輸出 名字是 name背景 其實是找...