mybatis order by +动态参数 防注入 效率浅析

/ Java / 1 条评论 / 7864浏览

前提

1. 预编译机制只能处理查询参数

2. SQL注入只能对编译过程起作用,所以这样的方式就很好地避免了SQL注入的问题。

3. #{}相当于jdbc中的preparedstatement

基于以上三条 order by 不能使用#{} 因为不能根据一段字符串进行排序 没有映射成字段名



解决方式

涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。 需要使用${} 直接进行拼接

<select id="orderBlogById" resultType="Blog" parameterType=”String”>

         SELECT id,title,author,content

         FROM blog

ORDER BY ${orderParam}

</select>

为什么呢? #{}传过来的参数带单引号'', ${}传过来的参数不带单引号。

但是在MyBatis中,“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。



防止order by +动态参数 的注入

  1. 前台返回用户orderby的数据格式限制为1,2,3,4,5这种 或者其他的 看懂就好 例如:http://www.wmsay.com/article?orderBy=1
  2. 后台java通过卫语句进行orderby 的最终字段 或者通过字典表进行查询 必需使用#{} 否则呵呵哒
  3. 使用mybatis方可使用${}进行查询,此时已经过滤了输入参数,保证参数纯净


效率

这种预编译的方式不仅能提高安全性,而且在多次执行同一个SQL时,能够提高效率。原因是SQL已编译好,再次执行时无需再编译。 当N次执行同一条sql语句时,节约了(N-1)次的编译时间,从而能够提高效率。

最终

最好使用#{} 不能的话 必需过滤