Mybatis的sql映射語句寫法

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注入

       輸入驗證:檢查輸入變量內容的合法性。

       錯誤信息處理:包裝內部異常信息和錯誤信息,不要直接顯示給別人看,錯誤信息顯示在日誌中自己看就可以了。

       數據加密:利用不常用的加密算法或鹽值對數據加密。

       使用存儲過程執行查詢

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章