Mybatis框架下易产生SQL注入漏洞的情况主要分为以下三种:
1.模糊查询
select * from table where name like ‘%#{name}%’
在这种情况下使用「#」 程序会报错,新手程序员就把「#」 号改成了「$」
这样如果 Java 代码层面没有对用户输入的内容做处理势必会产生 SQL 注入漏洞。
正确写法:
select * from table where name like concat(‘%’, #{name}, ‘%’)
2. in 之后的多个参数
in 之后多个 id 查询时使用 # 同样会报错
select * from table where id in (#{ids})
正确用法为使用 foreach,而不是将 # 替换为 $
id in
<foreach collection="ids" item="item" open="("separatosr="," close=")">
#{ids}
</foreach>
3. order by 之后
这种场景应当在 Java 层面做映射,设置一个字段/表名数组,仅允许用户传入索引值。这样保证传入的字段或者表名都在白名单里面。需要注意的是在 mybatis-generator 自动生成的 SQL 语句中,order by 使用的也是 $,而 like 和 in 没有问题。