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

回到顶部