现象
在集成druid
连接池组件后, 部分查询接口报错500, 提示内容如下: sql injection violation, part alway true condition not allow
分析
技术分析
接口查询使用的是mybatis generator
框架自定义规则配置来逆向生成mapper
和model
, 其中一个规则是定义状态字段不同值时条件就变为1=1
, 此为导致这次报错的源头原因. 但是该条查询语句直接放在mysql
里或者navicat
里执行都没问题, 没报错.
业务分析
这几个接口都是很久之前的接口,并不是新需求, 之前一起没问题, 最近几天才出现这个情况, 所以并不是接口的问题, 前端传参也没问题. 排除业务及传参错误.
查看最近的几次更新, 跟数据库相关的是集成了druid
连接池组件, 而druid
连接池配置里开启了防御sql
注入的filter
1, 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
有多个配置项, 可以把永真条件查询的配置设为允许即可2. 目前背景下, 此项为最优解.
# 开启WallFilter
spring.datasource.druid.filter.wall.enabled=true
# 允许永真查询条件
spring.datasource.druid.filter.wall.config.condition-and-alway-true-allow=true