mybatis使用order by #{}失效问题

mybatis使用order by #{}失效问题

解决方法:使用${}

注意这里主要是要区分mybatis的#{}和${}的区别,以及要防止order by{}注入问题


问题复现

查询一个分页需要根据create_time(创建时间)或update_time(修改时间)来进行升序或降序排列

入参传了以下两个字段

  • orderType (时间)

  • orderBy (升序/降序)

0----create_time
1----update_time
0----desc
1----asc


测试发现根本没有按时间升降序排列

<choose>
   <when test="orderType != null and orderType != '' and orderBy != null and orderBy != ''">
   		order by #{orderType} #{orderBy}
   </when>
   <otherwise>order by create_time desc</otherwise>
</choose>

<--也未生效--!>
order by #{orderType} #{orderBy}

将#{}改为${}后生效,如下

<choose>
   <when test="orderType != null and orderType != '' and orderBy != null and orderBy != ''">
   		order by ${orderType} ${orderBy}
   </when>
   <otherwise>order by create_time desc</otherwise>
</choose>

order by ${orderType} ${orderBy}

原因分析:

#{}是经过预编译的,是安全的
${}是未经过预编译的,只是取变量的值,是不安全的,存在sql注入

  • mybatis中order by / group by / like 某个字段的时候,要用${},不能用#{}

  • #{}将变量的值转化为字符串,即加上’ '。例:#{time}------>‘time’

  • ${}是直接输出变量的值。例:${time}----->time

  • 使用${}一定要手动处理一下输入的内容,判断一下输入的参数是否正常。防止潜在的SQL注入攻击

https://blog.csdn.net/lrenyan/article/details/156074311?spm=1011.2415.3001.10575&sharefrom=mp_manage_link

评论