MyBatis Order By注入错误
在开发过程中,安全问题非常重要,一定要注意sql注入问题。
常见的写法如下:
order by ${orderBy} ${orderType}
这里orderBy, orderType是前端传过来的话很容易产生sql注入问题。
《Mysql Order By注入总结》专门讲了如何利用这点进行常见的和猜测的sql注入。
为什么这样呢,因为mybatis里 $部分是原样输出的,拼接字符串的形式。
建议使用#方式,
order by #{orderBy} #{orderType}
#{}是经过预编译的,是安全的,而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在sql注入。
建议先在使用工具类对此类参数进行过滤,避免传到数据库中执行SQL报错。
类似于《图解Javad多线程设计模式》中所讲的“Balking模式”的思路,通过参数校验来保护目标处理。
推荐两种做法。
第一种:通过工具类比如用正则表达式,判断是否有除了英文大小写,数字和下划线外的其他特殊字符。
第二种:编写工具类,对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
如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。