集成druid连接池组件后部分查询报错问题

现象

在集成druid连接池组件后, 部分查询接口报错500, 提示内容如下: sql injection violation, part alway true condition not allow

分析

技术分析

接口查询使用的是mybatis generator框架自定义规则配置来逆向生成mapper和model, 其中一个规则是定义状态字段不同值时条件就变为1=1, 此为导致这次报错的源头原因. 但是该条查询语句直接放在mysql里或者navicat里执行都没问题, 没报错.

业务分析

这几个接口都是很久之前的接口,并不是新需求, 之前一起没问题, 最近几天才出现这个情况, 所以并不是接口的问题, 前端传参也没问题. 排除业务及传参错误.

查看最近的几次更新, 跟数据库相关的是集成了druid连接池组件, 而druid连接池配置里开启了防御sql注入的filter, druid会扫描时判断该条sql是有注入风险, 就直接报错.

但是 select * from table where 1=1 这样的sql却没有报错, 原因是一般情况下, where后面的条件不会是注入点, 所以where 1=1不会扫描, where condition=xx" and 1=1就会触发注入扫描.

解决方案

方案一

    问题是sql不规范导致的, 最好的解决方案是修改sql生成方式, 去掉这个字段的自定义插件配置, 生成正常规范的查询条件. 但是这个方案几乎涉及大部分接口, 改动及工作量很大, 在当前场景下不太合适.

方案二

    不开启此项插件(网上大部分的解决方案). 但是这样就会把所有的sql注入扫描关闭, 从安全角度来说并不妥当.
# 去掉wall
# spring.datasource.druid.filters=wall,stat
spring.datasource.druid.filters=stat

方案三

    druid的防御sql注入的filter:wall有多个配置项, 可以把永真条件查询的配置设为允许即可. 目前背景下, 此项为最优解.
# 开启WallFilter
spring.datasource.druid.filter.wall.enabled=true
# 允许永真查询条件
spring.datasource.druid.filter.wall.config.condition-and-alway-true-allow=true

经验分享 程序员 微信小程序 职场和发展