解决使用Druid+Mybatis导致Error updating database. Cause: java.sql.SQLException: sql injection violation

解决使用Druid+Mybatis导致Error updating database. Cause: java.sql.SQLException: sql injection violation, multi-statement not allow

问题描述

通过mybatisplus的xml手写了个批量更新语句,多个更新sql时导致这个报错

<update id="batchUpdateDetails" parameterType="java.util.List">
        <foreach collection="list" item="Detail" separator=";">
        update t__detail
            <set>
                platform_id = null,
                app = #{Detail.app,jdbcType=VARCHAR},
            </set>
            where id = #{Detail.id,jdbcType=INTEGER}
        </foreach>
    </update>

在这里插入图片描述

解决

[url添加 allowMultiQueries=true 后缀,添加druid配置]

	mysql:
        driverClassName: com.mysql.cj.jdbc.Driver
          username: root
          password: 12345
          url: jdbc:mysql://localhost:3306/phone_mng?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false&**allowMultiQueries=true**
          druid:
            wall:
              multi-statement-allow: true
使用 Druid 数据源版本 1.2.8 时,如果出现 `sql injection violation, multi-statement not allow` 错误,并导致数据库更新操作失败,这通常是由于 DruidSQL 防注入机制限制了多语句执行。Druid 默认禁止在一个 SQL 请求中执行多个语句,以防止 SQL 注入攻击。 ### 解决方案 #### 1. 修改 Druid WallConfig 配置 可以通过配置 `WallConfig` 来允许执行多语句 SQL,具体做法是在配置类中启用 `multiStatementAllow` 和 `noneBaseStatementAllow` 属性[^3]。 ```java @Configuration public class DruidConfig { @Primary @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource druidDataSource() { DruidDataSource druidDataSource = new DruidDataSource(); List<Filter> filterList = new ArrayList<>(); filterList.add(wallFilter()); filterList.add(statFilter()); druidDataSource.setProxyFilters(filterList); return druidDataSource; } @Bean public WallFilter wallFilter() { WallFilter wallFilter = new WallFilter(); wallFilter.setConfig(wallConfig()); return wallFilter; } @Bean public StatFilter statFilter() { StatFilter statFilter = new StatFilter(); return statFilter; } @Bean public WallConfig wallConfig() { WallConfig config = new WallConfig(); config.setMultiStatementAllow(true); // 允许一次执行多个 SQL 语句 config.setNoneBaseStatementAllow(true); // 允许非基本语句的 SQL 执行 return config; } } ``` 此方法适用于 Spring Boot 项目中的 Druid 集成场景,通过启用 `WallConfig` 中的 `multiStatementAllow` 选项来绕过多语句限制。 #### 2. 升级或降级 Druid 版本 某些版本的 DruidSQL 注入检查更为严格,尤其是 1.2.5 及以上版本。若当前环境允许,可以尝试升级到更高版本(如 1.2.9 或以上)或回退到更稳定的旧版本(如 1.1.x),部分用户反馈该问题在特定版本中已修复[^5]。 #### 3. 检查 SQL 语句结构 确保执行的 SQL 语句没有不必要的多语句拼接。例如,避免以下形式: ```sql UPDATE table SET col1 = 'val1'; UPDATE another_table SET col2 = 'val2'; ``` 而是将它们拆分为两个独立的请求执行。这种方式不仅更安全,也符合 Druid 的默认行为规范。 #### 4. 使用原生 JDBC 或其他数据源 如果业务逻辑确实需要频繁执行多语句 SQL,并且不希望修改 Druid 行为,可考虑临时切换为原生 JDBC 或 HikariCP 等数据源进行处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值