### Error querying database. Cause: java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.22, syntax error: EOF : select project_records_id, investigate_manifest_project_id, investigate_project, investigate_address, hazards_desc, hazards_level, rectify_term, rectify_suggestion, investigate_attendees, rectify_attendees, accept_attendees, create_user, create_time, update_user, update_time from org_hazards_investigate_manifest_project_records where investigate_manifest_project_id in ### The error may exist in com/carfi/safemanage/mapper/OrgHazardsInvestigateManifestProjectRecordsMapper.xml ### The error may involve com.carfi.safemanage.mapper.OrgHazardsInvestigateManifestProjectRecordsMapper.selectListByManifestProjectIdList ### The error occurred while executing a query
时间: 2025-07-11 21:39:42 浏览: 14
<think>嗯,用户遇到了Druid 1.2.22报SQL注入违反异常的问题,具体是mysql语法错误EOF出现在select语句中,使用OrgHazardsInvestigateManifestProjectRecordsMapper的时候。首先,我需要回忆一下Druid的机制,尤其是wall-filter的作用。根据引用[1],wall-filter会拦截多次声明请求的循环SQL,即使设置为true,分号也会被当作结束符,导致后续SQL报错。这可能和用户的问题相关,特别是如果他们的SQL中有分号或者多语句的情况。
接下来,引用[2]提到SQL注入违规的问题,可能用户写的SQL存在潜在注入风险,比如orderBy参数未处理,导致自动添加1=1之类的条件。这时候需要检查是否有动态拼接SQL的情况,特别是用户输入的参数是否直接拼接到查询中。此外,引用[3]说明了Druid如何根据SQL类型处理语法树,所以语法错误可能出现在SQL结构上,比如缺少括号、引号或者关键字错误。
用户的问题中还提到了EOF错误,这在SQL解析中通常意味着语句未正确结束,可能缺少分号或者引号不匹配。需要检查SQL语句的完整性,尤其是在动态生成的SQL中是否有拼接错误。比如,在MyBatis的Mapper XML文件中,是否正确使用了#{}而不是${},以防止注入同时避免语法错误。
另外,Druid的版本是1.2.22,可能有一些已知的bug或者配置问题。需要确认用户是否配置了wall-filter的规则,比如是否允许特定的语法。比如,需要检查wall的config属性,是否允许SELECT必须有WHERE条件,或者是否禁止某些函数。
可能的解决方案包括:
1. 检查SQL语句是否有语法错误,特别是动态生成的部分,比如条件判断、循环拼接是否有误。
2. 检查是否使用了正确的占位符(#{}),避免使用${}导致注入风险。
3. 配置Druid的wall-filter,放宽一些限制,比如设置selectAllow为true,或者关闭某些检查。
4. 升级Druid版本,看是否有已知的问题在后续版本修复。
5. 检查MyBatis的Mapper文件,确保XML中的SQL正确,比如标签是否正确闭合,参数是否正确传递。
此外,用户提到的EOF错误,可能在select语句中缺少必要的部分,比如子查询未正确结束,或者字符串引号未闭合。需要具体查看生成的SQL语句,是否有明显的语法错误。可能通过日志打印出实际执行的SQL,或者在Druid中开启SQL监控来查看被拦截的具体原因。
最后,结合用户提供的引用,解决方案可能涉及调整wall-filter配置,处理SQL拼接方式,以及验证参数传递是否正确。需要逐步排除可能的原因,从SQL语句本身到框架配置,逐一检查。</think>### 解决方案:Druid 1.2.22 SQL注入违反异常与语法错误分析
#### 1. 检查SQL语句语法完整性
- **问题**:`EOF`错误通常因SQL语句未正确结束或语法结构错误(如缺少括号、引号未闭合)导致。例如:
```sql
SELECT * FROM table WHERE id = '123 -- 缺少闭合引号
```
- **解决方法**:
- 确保动态生成的SQL语句符合MySQL语法规范,尤其是引号、括号的闭合。
- 通过日志打印实际执行的SQL语句,验证其完整性[^2]。
#### 2. 处理SQL注入拦截规则
- **Druid WallFilter机制**:Druid默认启用`WallFilter`拦截潜在危险的SQL操作,如多语句执行(分号分隔)、`SELECT`无`WHERE`条件等[^1]。
- **配置调整**:
```properties
# 在application.properties中添加以下配置
spring.datasource.druid.filter.wall.config.multi-statement-allow=true # 允许多语句
spring.datasource.druid.filter.wall.config.select-all-column-allow=true # 允许SELECT *
```
若仍报错,可尝试临时关闭WallFilter(不推荐长期使用):
```java
@Bean
public FilterRegistrationBean<WallFilter> wallFilter() {
FilterRegistrationBean<WallFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new WallFilter());
registration.setEnabled(false); // 禁用WallFilter
return registration;
}
```
#### 3. 检查MyBatis Mapper文件
- **动态SQL风险**:若使用`${}`拼接参数(如`ORDER BY ${field}`),可能触发SQL注入拦截。
- **优化建议**:
```xml
<!-- OrgHazardsInvestigateManifestProjectRecordsMapper.xml -->
<select id="queryRecords" resultType="...">
SELECT * FROM table
WHERE 1=1
<if test="param != null">
AND column = #{param} <!-- 使用#{}而非${} -->
</if>
ORDER BY
<choose>
<when test="orderField == 'safe'">field1</when>
<otherwise>id</otherwise>
</choose>
</select>
```
- 避免直接拼接用户输入,改用预编译参数或固定选项。
#### 4. 升级Druid版本
- **版本兼容性**:Druid 1.2.22可能存在已知解析缺陷,尝试升级至最新版本(如1.2.21或更高),部分语法规则会更宽松[^3]。
#### 5. 检查SQL语句类型匹配
- **Druid的SQL解析逻辑**:Druid会根据SQL类型(SELECT/INSERT等)生成对应的语法树节点,若语句结构不符合预期(如混合DML和DDL),会触发异常[^3]。
- **验证方法**:确保SQL语句为纯`SELECT`操作,未包含隐式子查询外的其他操作。
---
### 相关问题
1. **如何通过日志定位Druid拦截的具体SQL内容?**
- 答:启用Druid的SQL监控功能,在`application.properties`中设置`spring.datasource.druid.filter.stat.log-slow-sql=true`,并查看控制台输出的拦截日志[^1]。
2. **MyBatis中#{}和${}的区别如何影响Druid的拦截行为?**
- 答:`#{}`使用预编译防止注入,而`${}`直接拼接SQL,可能触发WallFilter的注入规则。
3. **Druid如何区分SQL注入攻击和合法动态SQL?**
- 答:通过预定义的安全规则(如禁止无WHERE的DELETE)和语法树分析,但需开发者配合参数化查询。
阅读全文
相关推荐



















