Mybatis框架下SQL注入安全编写整理
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>
...
禁止转载
以上是 Mybatis框架下SQL注入安全编写整理 的全部内容, 来源链接: utcz.com/z/517000.html