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插件进行排序。