Mybatis框架防SQL注入寫法
阿新 • • 發佈:2021-06-24
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沒有問題。