Mybatis框架下SQL注入安全编写整理

≯℡__Kan透↙ 提交于 2020-08-09 20:16:42

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>
  ...

再来一个例子:

或者

禁止转载

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!