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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明明如月学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值