mybatis模糊查詢 Like
Mybatis模糊查詢like語句有幾種拼寫方式:
<select id="query" resultMap="ManualResultMap" parameterType="Map">
SELECT a.*, b.client_name
FROM publish a
LEFT JOIN client b
ON a.client_code = b.client_code
WHERE 1=1
<if test="null != adClient">
and a.ad_client = #{adClient}
</if>
<if test="null != product">
and a.product = #{product}
</if>
<if test="null != pageNo and null != pageSize">
limit #{pageNo},#{pageSize}
</if>
</select>
1.使用#{} 。 因爲#{ }解析成sql語句時候,把變量默認爲字符串,會在變量外側自動加單引號' ',所以這裏 % 需要使用雙引號" ",不能使用單引號 ' ',不然會查不到任何結果
<if test="null != product">
and a.product like "%"#{product,jdbcType=VARCHAR}"%"
</if>
即sql爲:and a.product like ‘%美汁%’
2.使用${ } 。 直接將參數顯示注入到sql中,弊端:可能引起sql注入問題。不建議使用。
<if test="null != product">
and a.product like '%${product}%'
</if>
即:傳入變量“美汁”時,對應的sql爲:and a.product like ‘%美汁%’
當傳入的變量爲“美汁%’ or 1=1 or a.product like ‘%你好 ”,sql會直接注入從參數,顯示爲:
and a.product like ‘美汁%’ or 1=1 or a.product like ‘%你好’
此時,sql語句的意思已經發生變化,這種現象叫做sql注入問題,所以一般不建議使用${}
3.使用concat(a,b,c) 。使用函數連接sql語句。
<if test="null != product">
and a.product like CONCAT('%',#{product,jdbcType=VARCHAR},'%')
</if>
SQL注入問題
什麼是sql注入
所謂sql注入就是web後臺應用程序存在安全漏洞,在輸入的字符串中嵌入sql指令,缺乏字符檢查的程序將這些字符串誤認爲是正常的sql指令,利用這些sql指令執行數據庫操作,可能嚴重破壞數據庫。
舉個例子:
mybatis中使用${}時,會直接注入顯示變量,容易出現sql注入問題,使用#{},則將變量作爲字符串處理,會自動爲變量添加雙引號,不易出現sql注入,較爲安全。
有的應用程序喜歡直接拋異常,web頁面上顯示sql語句錯誤詳情,這都很容易讓人猜到背後執行的sql語句。比如這樣的一句錯誤:“Syntax error (missing operator) in query expression 'username = 'admin'' AND password = 'admin'''.”
很容易猜到:這是一個登陸賬號的sql查詢語句:select * from user where username=? and password=?
如果後臺使用${}來接受sql變量:當頁面賬號和密碼都輸入“admin' or '1”時:對應的sql則變成:
select * from [users] where username=’admin’ or ‘1’ and password=’admin’ or ‘1’
這句sql就變成永遠成立,可以查出來賬號密碼信息。
這就是一個典型的sql注入問題。
如何防備Sql注入
輸入驗證:檢查輸入變量內容的合法性。
錯誤信息處理:包裝內部異常信息和錯誤信息,不要直接顯示給別人看,錯誤信息顯示在日誌中自己看就可以了。
數據加密:利用不常用的加密算法或鹽值對數據加密。
使用存儲過程執行查詢