1. 程式人生 > 其它 >Mybatis框架防SQL注入寫法

Mybatis框架防SQL注入寫法

Mybatis框架防SQL注入寫法

Mybatis的SQL語句可以基於註解的方式寫在類方法上面,但我們更多的是以xml的方式寫到xml檔案。

編寫xml檔案時,mybatis支援兩種引數符號,一種是#,另一種是$ ( #使用預編譯,$使用拼接SQL )。

比如:

<select id="queryAll" resultMap="resultMap">
select * from 表名 where id = #{id}
</select>

Mybatis框架下易產生SQL注入漏洞的情況主要分為以下三種:

1、模糊查詢

錯誤寫法 :

<!--
在這種情況下使用`#`會報錯,如果把#號改成了$,這樣java程式碼沒有對使用者輸入的內容做處理勢必會產生SQL注入漏洞。
-->
select * from 表名 where title like '%#{title}%'

正確寫法 :

select * from 表名 where title like concat('%',#{title}, '%')

2、in 之後的多個引數

錯誤寫法 :

<!--
in之後多個id查詢時使用# 同樣會報錯
-->
select * from 表名 where id in (#{ids}) 

正確用法:

<!--
使用foreach,而不是將#替換為$
-->
select * from 表名 where id in
<foreach collection="ids" item="id" open="("  separatosr=","  close=")">
#{ids}
</foreach>

3、order by 之後

這種場景應當在Java層面做對映,設定一個欄位/表名陣列,僅允許使用者傳入索引值。這樣保證傳入的欄位或者表名都在白名單裡面。需要注意的是在mybatis自動生成的SQL語句中,order by使用的也是$,而like和in沒有問題。