在开发过程中,安全问题非常重要,一定要注意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的属性中。
这里Set建议使用不可变集合。
如:
private static final Set VALID_COLUMNS_FOR_ORDER_BY
= Collections.unmodifiableSet(Stream
.of("acc_number","branch_id","balance")
.collect(Collectors.toCollection(HashSet::new)));
或者
private static final Set 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
如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有