druid检查sql注入时报 sql injection violation, syntax error:expect RPAREN, actual IDENTIFIER token INTEGER

本文解决了一个因SQL注入引发的语法错误问题,通过调整SQL语句中的参数类型,成功避免了INTEGER标识符引起的语法错误,确保了数据库查询的正确性和安全性。

Caused by: java.sql.SQLException: sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER pos 429, line 20, column 79, token IDENTIFIER INTEGER : SELECT

A .SYS_CODE,                              
               ifnull(SUM(tnm),'0') TNM
               
        FROM
            (
                SELECT
                    r.SYS_CODE,
                    cps.PROBLEM_ID,
                    cps.QUESTION_NM TNM,
                    cps.QUESTION_TO_BE_SOLVE BSO
                FROM
                t_dq_check_rule r
                LEFT JOIN t_dq_check_problem_sum cps ON r.CHECK_RULE_ID = cps.CHECK_RULE_ID
                WHERE                        
            date_format(cps.start_dt,'%Y-%m-%d') >= date_format(now()-cast(? AS SIGNED INTEGER),'%Y-%m-%d')                      
                AND r.SYS_CODE = ?
            
            ) A
        GROUP BY
            A .SYS_CODE
        ORDER BY
            A .SYS_CODE

结果改成date_format(cps.start_dt,'%Y-%m-%d') >= date_format(now()-cast(? AS SIGNED),'%Y-%m-%d')将其中的INTEGER去掉就可以了

<think>我们再次遇到 Druid 报告的 SQL 注入违规和语法错误。本次错误信息如下: - **错误类型**:`sql injection violation`(SQL注入违规)和 `syntax error`(语法错误) - **数据库类型**:MySQL - **Druid版本**:1.2.8 - **具体语法错误**:`expect EQ, actual IDENTIFIER`(期待等号,实际得到标识符) - **位置**:第6行,第22列(位置127),令牌为`order_status` - **SQL语句开头**:`update invoice_order` ### 错误分析 1. **语法错误原因**: - 错误信息指出在`update`语句中,Druid解析器在位置127(第6行第22列)处遇到了一个标识符(`order_status`),但它期望的是一个等号(`=`)。 - 这通常意味着在设置更新字段时,字段名和值之间缺少等号。例如: ```sql -- 错误示例(缺少等号) UPDATE invoice_order order_status = 'completed' -- 这里应该是 set order_status = 'completed' WHERE ...; ``` 或者 ```sql -- 错误示例(set子句后直接跟字段名,缺少等号) UPDATE invoice_order SET order_status -- 这里缺少等号,应该是 SET order_status = ... ``` 正确的写法必须有`SET`关键字,且每个赋值语句为`字段名=值`。 2. **SQL注入违规**: - 虽然语法错误可能是根本原因,但Druid时报告了SQL注入违规。这可能是因为: - 语法错误导致Druid无法正确解析后续内容,将某些部分误认为注入。 - 使用了动态SQL(如MyBatis中`${}`拼接)且未过滤输入,触发了Druid的防护机制。 ### 解决方案 1. **检查UPDATE语句的语法**: - 确保语句中包含`SET`关键字,且每个更新项都是`字段名=值`的格式。 - 检查第6行第22列附近(即`order_status`周围)是否有遗漏的等号或逗号。 2. **检查动态SQL拼接**: - 如果使用了MyBatis,避免使用`${}`直接拼接变量(尤其是用户输入)。优先使用`#{}`进行参数化。 - 如果必须使用`${}`(如动态字段名),需在Java层进行严格的白名单校验。 3. **升级Druid版本**: - Druid 1.2.8版本较旧,可能存在误报。建议升级到最新稳定版(如1.2.16+): ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> </dependency> ``` 4. **查看完整SQL日志**: - 通过MyBatis日志或Druid监控台输出实际执行的SQL,定位具体错误位置: ```properties # 开启MyBatis日志 logging.level.org.mybatis=DEBUG ``` ### 示例修正 假设原更新语句(MyBatis XML)如下: ```xml <update id="updateOrder" parameterType="..."> UPDATE invoice_order <set> order_status #{orderStatus}, <!-- 错误:缺少等号 --> update_time = #{updateTime} </set> WHERE ... </update> ``` 修正后: ```xml <update id="updateOrder" parameterType="..."> UPDATE invoice_order <set> order_status = #{orderStatus}, <!-- 添加等号 --> update_time = #{updateTime} </set> WHERE ... </update> ``` §§相关问题§§ 1. 在MySQL的UPDATE语句中,SET子句的正确语法结构是什么? 2. 如何避免在动态SQL拼接时触发DruidSQL注入告警? 3. MyBatis中`<set>`标签的作用是什么?使用时有哪些注意事项? 4. 除了升级Druid,还有哪些方法可以解决SQL注入误报问题? 5. 如何配置Druid以记录实际执行的SQL语句? </think>这个错误是 Druid (1.2.8 版本) 在 MySQL 环境下报告的 SQL 注入违规和语法错误组合。具体分析如下: ### 错误原因解析 1. **语法错误核心问题** - `expect EQ, actual IDENTIFIER`:表示 SQL 解析器期望看到等号(`=`),但实际遇到了标识符(这里是 `order_status`) - 位置:第6行第22列 (位置127),在 `update invoice_order` 语句中 - **典型场景**:在 UPDATE 语句中缺少必要的 `SET` 关键字或等号 ```sql -- 错误示例(缺少SET): UPDATE invoice_order order_status = 'paid' WHERE ... ❌ -- 正确写法: UPDATE invoice_order SET order_status = 'paid' WHERE ... ✅ ``` 2. **SQL 注入违规触发** - Druid 误将语法错误识别为注入尝试(常见于低版本) - 特别是当动态 SQL 中包含变量时(如 MyBatis 的 `${}` 或 `#{}`),旧版 Druid 可能错误触发防护 3. **位置分析** `pos 127, line 6, column 22` 暗示问题可能出现在: - UPDATE 后直接跟字段名(缺少 `SET`) - 字段赋值时缺少等号(如 `order_status 'paid'`) --- ### 解决方案 1. **修复 SQL 语法** ```sql -- 确保包含 SET 关键字和等号 UPDATE invoice_order SET order_status = #{value} -- MyBatis 参数写法 WHERE ... ``` 2. **检查 MyBatis 映射文件** ```xml <update id="updateOrder"> UPDATE invoice_order SET <!-- 检查每个字段赋值是否都有等号 --> order_status = #{status}, <!-- 正确 --> amount = #{amount} <!-- 正确 --> WHERE ... </update> ``` 3. **升级 Druid (关键修复)** ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> <!-- 修复误报问题 --> </dependency> ``` 4. **添加 Druid 白名单规则** 在 `application.properties` 中: ```properties # 允许 UPDATE 语句格式 spring.datasource.druid.filter.wall.update-allow=true # 禁用部分严格检查 spring.datasource.druid.filter.wall.config.multi-statement-allow=true ``` --- ### 预防措施 - 使用 MyBatis 时避免混用 `${}` 和 `#{}` - 启用 SQL 日志验证实际执行语句: ```properties logging.level.org.mybatis=DEBUG ``` - 对动态字段名使用白名单校验(而非直接拼接)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值