# SqlAuditKit **Repository Path**: ismartyx/sql-audit-kit ## Basic Information - **Project Name**: SqlAuditKit - **Description**: 基于 JSQLParser 4.9 构建的 SQL 解析、审计与反向 SQL 生成工具库。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-16 - **Last Updated**: 2026-06-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SqlAuditKit 基于 [JSQLParser 4.9](https://github.com/JSQLParser/JSqlParser) 构建的 SQL 解析、审计与反向 SQL 生成工具库。 ## 功能概览 | 模块 | 说明 | |--------|------------------------------------------------| | SQL 解析 | 将 SQL 字符串解析为 AST 语句对象 | | 类型识别 | 识别 SELECT / INSERT / UPDATE / DELETE / DDL 等类型 | | 信息提取 | 提取涉及的表名、是否含 JOIN、是否含子查询 | | SQL 审计 | 多规则链式审计,检测高危/不规范操作 | | 反向 SQL | 根据原始 SQL 推导逆向操作语句 | | 回滚 SQL | 提供回滚提示(UPDATE 需配合数据快照) | --- ## 项目结构 ``` src/main/java/com/sample/sqlparse/ ├── SqlParseDemo.java # 演示入口 ├── core/ # 核心工具类 │ ├── SqlParseUtil.java # SQL 解析工具(JSQLParser 封装) │ ├── SqlType.java # SQL 类型枚举 │ ├── SqlTypeDetector.java # SQL 类型识别 │ ├── SqlInfoExtractor.java # 表名 / JOIN / 子查询提取 │ ├── SqlAuditResult.java # 审计结果模型 │ ├── SqlAuditor.java # 审计器(规则链执行) │ ├── ReverseSqlGenerator.java # 反向 SQL 生成器 │ └── RollbackSqlGenerator.java # 回滚 SQL 生成器 └── rule/ # 审计规则 ├── AuditRule.java # 规则接口 ├── DeleteWithoutWhereRule.java # 禁止无 WHERE 的 DELETE ├── LargeUpdateRule.java # 大范围 UPDATE/DELETE 检测 ├── MultiTableDmlRule.java # 多表 DML 检测 ├── NoColumnInsertRule.java # INSERT 未指定列名检测 ├── SelectAllColumnsRule.java # SELECT * 检测 ├── DangerousDdlRule.java # 高危 DDL 检测(DROP/TRUNCATE/ALTER DROP) ├── SqlInjectionRiskRule.java # SQL 注入风险检测 └── TableBlacklistRule.java # 表黑名单规则 ``` --- ## 快速开始 ### 依赖 `build.gradle`: ```groovy dependencies { implementation 'com.github.jsqlparser:jsqlparser:4.9' } ``` ### 运行 Demo ```bash ./gradlew "com.sample.sqlparse.SqlParseDemo.main()" ``` --- ## 核心模块说明 ### 1. SQL 解析 ```java Statement statement = SqlParseUtil.parse("SELECT id FROM user WHERE id = 1"); ``` ### 2. 类型识别 ```java SqlType type = SqlTypeDetector.detect(statement); // → SELECT ``` 支持类型:`SELECT` / `INSERT` / `UPDATE` / `DELETE` / `CREATE` / `DROP` / `ALTER` / `TRUNCATE` / `REPLACE` / `OTHER` ### 3. 信息提取 ```java List tables = SqlInfoExtractor.extractTables(statement); boolean hasJoin = SqlInfoExtractor.hasJoin(statement); boolean hasSub = SqlInfoExtractor.hasSubquery(statement); ``` ### 4. SQL 审计 ```java SqlAuditor auditor = new SqlAuditor() .addRule(new DeleteWithoutWhereRule()) .addRule(TableBlacklistRule.forDeleteAndUpdate("password", "user_auth")) .addRule(new SelectAllColumnsRule()) .addRule(new DangerousDdlRule()) .addRule(new LargeUpdateRule()) .addRule(new MultiTableDmlRule()) .addRule(new NoColumnInsertRule()) .addRule(new SqlInjectionRiskRule()); SqlAuditResult result = auditor.audit(statement); if(!result. isPassed()){ result. getMessages(). forEach(System.out::println); } ``` ### 5. 反向 SQL / 回滚 SQL ```java String reverse = ReverseSqlGenerator.generate(statement); String rollback = RollbackSqlGenerator.generate(statement); ``` | 原始 SQL 类型 | 反向结果 | |---------------------|----------------------------------------| | `INSERT ... VALUES` | `DELETE FROM ... WHERE 列=值 AND ...` | | `INSERT ... SELECT` | `[需确认] DELETE FROM ...`(含原始 WHERE) | | `DELETE ... WHERE` | `[推测] INSERT INTO ... VALUES (...)` | | `DELETE`(无 WHERE) | `[不支持]` | | `UPDATE` | `[需快照] UPDATE ... SET 列=<原值>`(需配合数据快照) | --- ## 审计规则说明 | 规则类 | 触发场景 | 风险等级 | |--------------------------|-----------------------------------------------|------| | `DeleteWithoutWhereRule` | DELETE 无 WHERE | 禁止 | | `LargeUpdateRule` | UPDATE/DELETE 无 WHERE、仅 OR 条件、全模糊 LIKE | 高风险 | | `MultiTableDmlRule` | UPDATE/DELETE 涉及多表或 JOIN | 高风险 | | `NoColumnInsertRule` | INSERT 未指定列名 | 不推荐 | | `SelectAllColumnsRule` | SELECT * | 不推荐 | | `DangerousDdlRule` | DROP TABLE/DATABASE/INDEX、TRUNCATE、ALTER DROP | 高危 | | `SqlInjectionRiskRule` | 永真式、注释符、多语句分号、时间盲注函数 | 安全风险 | | `TableBlacklistRule` | 对黑名单表执行 DELETE/UPDATE | 禁止 | ### 自定义规则 实现 `AuditRule` 接口即可: ```java public class MyRule implements AuditRule { @Override public SqlAuditResult audit(Statement statement) { // 自定义检测逻辑 return SqlAuditResult.pass(); } } ``` --- ## 技术栈 - **Java 17** - **JSQLParser 4.9** - **Gradle 9** - **JUnit Jupiter 6**(测试)