MyBatis Order By注入错误

在开发过程中,安全问题非常重要,一定要注意sql注入问题。

常见的写法如下:

order by ${orderBy}  ${orderType}

这里orderBy, orderType是前端传过来的话很容易产生sql注入问题。

《Mysql Order By注入总结》专门讲了如何利用这点进行常见的和猜测的sql注入。

 

为什么这样呢,因为mybatis里  $部分是原样输出的,拼接字符串的形式。

建议使用#方式,

order by #{orderBy}  #{orderType}

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

 

建议先在使用工具类对此类参数进行过滤,避免传到数据库中执行SQL报错。

类似于《图解Javad多线程设计模式》中所讲的“Balking模式”的思路,通过参数校验来保护目标处理。

MyBatis Order By注入错误

推荐两种做法。

第一种:通过工具类比如用正则表达式,判断是否有除了英文大小写,数字和下划线外的其他特殊字符。

第二种:编写工具类,对orderType匹配是否为DESC,desc,ASC,asc四个字符串,orderBy是否在指定的规定Set<String>的属性中。

这里Set建议使用不可变集合。

如:

private static final Set<String> VALID_COLUMNS_FOR_ORDER_BY
  = Collections.unmodifiableSet(Stream
      .of("acc_number","branch_id","balance")
      .collect(Collectors.toCollection(HashSet::new)));

或者

private static final Set<String> VALID_COLUMNS_FOR_ORDER_BY = ImmutableSet.of("acc_number","branch_id","balance");

工具类这里就不给出来了,写出来很容易。

 

相关文章:

https://www.programering.com/a/MzM1gDMwATE.html

https://www.baeldung.com/sql-injection

https://www.cnblogs.com/chyu/p/4389701.html

如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。