mybatis的#通过合理使用其实是能覆盖到所有的sql编写场景的,所以还是需要打好基本功
1. 模糊查询like
Select * from news where title like '%#{title}%'
# 但由于这样写程序会报错,研发人员将SQL查询语句修改如下:
Select * from news where title like '%${title}%'
# 在这种情况下我们发现程序不再报错,但是此时产生了SQL语句拼接问题,如果java代码层面没有对用户输入的内容做处理势必会产生SQL注入漏洞。
# 可将SQL查询语句设计如下:
select * from news where tile like concat('%', #{title}, '%')
# 采用预编译机制,避免了SQL语句拼接的问题,从根源上防止了SQL注入漏洞的产生。
再来一个例子:
2. in之后的参数
# 在对同条件多值查询的时候,如当用户输入1001,1002,1003…100N时,如果考虑安全编码规范问题,其对应的SQL语句如下:
Select * from news where id in (#{id})
# 但由于这样写程序会报错,研发人员将SQL查询语句修改如下:
Select * from news where id in (${id})
#修改SQL语句之后,程序停止报错,但是却引入了SQL语句拼接的问题,如果研发人员没有对用户输入的内容做过滤,势必会产生SQL注入漏洞。
# 可使用Mybatis自带循环指令解决SQL语句动态拼接的问题:
select * from news where id in
<foreach collection="ids" item="item" open="(" separator="," close=")">#{item}</foreach>
再来一个例子:
3. order by之后
# 当根据发布时间、点击量等信息进行排序的时候,如果考虑安全编码规范问题,其对应的SQL语句如下:
Select * from news where title = '京东' order by #{time} asc
# 但由于发布时间time不是用户输入的参数,无法使用预编译。研发人员将SQL查询语句修改如下:
Select * from news where title = '京东' order by ${time} asc
# 修改之后,程序通过预编译,但是产生了SQL语句拼接问题,极有可能引发SQL注入漏洞。
# 可使用Mybatis自带choose指令解决SQL语句动态拼接的问题:
ORDER BY
<choose>
<when test="orderBy == 1">
id desc
</when>
<when test="orderBy == 2">
date_submitted desc
</when>
...
再来一个例子:
或者
禁止转载
来源:oschina
链接:https://my.oschina.net/9199771/blog/4297072