[问题记录] sql注入:sql injection violation, token set

在项目中遇到一个SQL更新数据的问题,由于使用了动态SQL,导致Druid的Wall Filter抛出'sql injection violation, token set'异常。分析原因是Druid认为在CASE语句中使用SET可能存在SQL注入风险。解决方法是根据需求选择使用CASE(字段维度)或CHOOSE(语句维度)来避免该异常。" 101717301,8754932,Python枚举与Class/Metaclass深度解析,"['Python开发', '后端', '编程语言', 'Python基础']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

项目中有个sql的功能是更新数据库对应的数据,sql根据入参动态变化

问题描述:

我在mapper.xml文件中写下了这样一段代码,设param为mybatis传入的参数

   update payment_order
   case a when 1 then set 某字段
          when 2 then set 某字段 end
   where 具体条件

运行时报错,如标题所示,sql injection violation, token set


原因分析:

原因已经挺清楚的了,这是druid的wall filter对传入的sql进行检测后抛出的异常,由异常中的token set我们可以知道,druid不允许在case语句体中有set语句,这样有sql注入的危险,不允许执行。

解决方案:

1. 可以将set字段的语句放在case语句体外面,
   update payment_order set 某字段 =
   case a when 1 then x值
          when 2 then y值 end
   where 具体条件
2. 改用mybatis提供的<choose>标签,将语句改为
update payment_order 
<choose>
   <when test = "a == 1">
             set 某字段 = x
   <when/>
       <when test = "a == 2">
             set 某字段 = y
   <when/>
<choose/>
where 具体条件

总结:如果是字段维度,用case好,如果是语句维度,用choose比较方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值