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

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

现象

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

分析

技术分析

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

业务分析

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

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

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

Druid扩展插件

解决方案

方案一

  • 问题是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

  1. DruidDataSource配置属性 ↩︎

  2. Druid github Issues ↩︎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值