Mybatis的SQL注入問題學習
阿新 • • 發佈:2021-07-09
Mybatis的SQL語句可以基於註解的方式寫在類方法上面,更多的是以xml的方式寫到xml檔案。Mybatis中SQL語句需要我們自己手動編寫或者用generator自動生成。編寫xml檔案時,MyBatis支援兩種引數符號,一種是#,另一種是$。比如:
<select id="queryInfo" resultType="store.pejkin.News"> SELECT * FROM NEWS WHERE ID = #{id} </select>
#使用預編譯,$使用拼接SQL。
Mybatis框架下易產生SQL注入漏洞的情況
1、模糊查詢
Select * from news where title like ‘%#{title}%’ 編譯錯誤
Select * from news where title like ‘%${title}%’ 存在sql漏洞
select * from news where tile like concat(‘%’,#{title}, ‘%’)
或者
select * from news where tile like '%'||#{deptName}||'%'
2、in 之後的多個引數
Select * from news where id in (#{ids}) 編譯錯誤
Select * from news where
idin
<foreachcollection="ids"item="item"open="("separatosr=","close=")">
#{ids}
</foreach>
3、order by
這種場景應當在Java層面做對映,設定一個欄位/表名陣列,僅允許使用者傳入索引值。這樣保證傳入的欄位或者表名都在白名單裡面。需要注意的是在mybatis-generator自動生成的SQL語句中,order by使用的也是$,而like和in沒有問題