mybatis中使用like萬用字元丟擲異常

2021-09-28 13:08:24 字數 1063 閱讀 8763

一,業務場景再現

解決方法我們可以使用${},因為$將傳入的資料直接顯示生成在sql中。如:where username=$,如果傳入的值是111,那麼解析成sql時的值為where username=111;而不會自動新增分號。但是這樣一做又會引起sql注入問題,所以我們這裡可以這樣來操作以避免sql注入,

select * from user where username like concat('%',#,'%')

二,關於mybatis中$與#的深入了解

1、#將傳入的資料都當成乙個字串,會對自動傳入的資料加乙個雙引號。

如:where username=#,如果傳入的值是111,那麼解析成sql時的值為where username="111", 如果傳入的值是id,則解析成的sql為where username="id". 

2、$將傳入的資料直接顯示生成在sql中。

如:where username=$,如果傳入的值是111,那麼解析成sql時的值為where username=111;

3、針對上面的sql,如果傳入的值是;drop table user;,

那麼第一條用#{}的sql解析為:select id, username, password, role from user where username=";drop table user;"

那麼第二條用${}的sql解析為:select id, username, password, role from user where username=;drop table user;

這時候已經sql注入了。

3、#方式能夠很大程度防止sql注入,$方式無法防止sql注入。

4、$方式一般用於傳入資料庫物件,例如傳入表名和列名,還有排序時使用order by動態引數時需要使用$ ,order by $

5、一般能用#的就別用$,若不得不使用「$」這樣的引數,要手工地做好過濾工作,來防止sql注入攻擊。

6、在mybatis中,「$」這樣格式的引數會直接參與sql編譯,從而不能避免注入攻擊。但涉及到動態表名和列名時,只能使用「$」這樣的引數格式。所以,這樣的引數需要我們在**中手工進行處理來防止注入。

myBatis中使用like進行查詢

1.使用mybatis中提供的方法 oracle與mysql通用 select from t user where 1 1 and name like 2.如果是mysql,則使用mysql自身的方法 concat關鍵字是 將多個字串進行拼接 select from t user where nam...

在sp executesql中使用like字句

在sp executesql中可以執行引數化的sql,但是如果sql中有like,那麼一般都要拼字串,下面的例子把兩者結合了起來,既有拼sql的靈活性,又有引數化sql的優點。declare likesql nvarchar 32 定義乙個like變數,如果是儲存過程,此處可以儲存過程的引數 set...

在sp executesql中使用like字句

在sp executesql中可以執行引數化的sql,但是如果sql中有like,那麼一般都要拼字串,下面的例子把兩者結合了起來,既有拼sql的靈活性,又有引數化sql的優點。declare likesql nvarchar 32 定義乙個like變數,如果是儲存過程,此處可以儲存過程的引數 set...