mybatis的#与$的sql注入问题

#与$的区别

默认情况下,使用#{}格式的语法会导致MyBatis的创建的PreparedStatement参数并安全地设置参数(就像使用?一样)。

这样做更安全,更迅速,通常也是首选做法。

mybatis中在xml文件编写sql语句时,我们一般用到的是#

比如:select * from user where id = #{id}

这样子做,预处理之后变为

select * from user where id = ?

然后将我们传递的id传到“ ?”去。比如id为10,传递后就变为

select * from user where id = 10

 

但是,在进行order by 排序时,由于我们后面一般都是拼接字段进行排序,所以要使用$

比如:select * from user order by ${param}

假如我们通过年龄排序,将age传递到语句中,就变为:

select * from user order by age

这样子是成功的。但是$是有sql注入风险的,官方也不推荐使用$。

如果我们order by排序使用#,那么#{param}就会使传递参数变为:

select * from user order by 'age'

多了两个引号,这样子将会导致排序失败。

 

解决方案

一、通过增加一个sql防注入过滤器,解决$的sql注入安全问题。

  详情请点击这个链接:https://www.cnblogs.com/czfan/p/15039504.html

二、通过pageHelper插件进行排序。

 

总结:能用#就用#,尽量不要用$。

posted @ 2021-08-05 15:45  cZgreat  阅读(446)  评论(0)    收藏  举报