slowql/slowql

GitHub: slowql/slowql

一款完全离线的 SQL 静态分析工具,通过 282 条规则检测安全、性能、可靠性、合规、成本和质量问题,支持 CI/CD 集成。

Stars: 141 | Forks: 9

SlowQL Logo

**面向生产的离线 SQL 静态分析器。** 在代码到达生产环境之前,捕获安全漏洞、性能回归、可靠性问题、合规风险、成本低效和代码质量问题。

## 为什么选择 SlowQL **离线优先分析。** 无需连接实时数据库即可捕获 bug。SlowQL 完全基于 SQL 源文件运行,可在任何地方安全运行。 **自定义规则引擎。** 通过 YAML 规则或 Python 插件定义您自己的组织 SQL 规范。自定义规则与内置目录无缝集成,支持完整的报告和抑制功能。 **282 条内置规则。** 涵盖安全、性能、可靠性、合规、成本和质量。每个规则都包含影响文档、修复指导和严重性分类。 **死 SQL 检测。** 安全识别未使用的数据库对象和冗余代码。SlowQL 通过分析整个项目中定义和使用情况,检测未使用的视图、存储过程和函数。它还会标记过程中无法到达的代码路径(例如 `RETURN` 之后的代码)以及应该合并的几乎重复的查询。 **跨文件 SQL 分析。** 检测多个文件中的破坏性更改。SlowQL 理解 DDL、视图和过程之间的关系,当一个文件中的架构更改(例如 `DROP COLUMN`)破坏另一个文件中的查询时,会发出警告。 **dbt 和 Jinja 支持。** 原生解析包含 Jinja 标签(`{{ ref() }}`、`{%if%}`、`{%for%}`)的 dbt 模型和 SQL 模板。强制执行 dbt 最佳实践,包括缺失引用和硬编码架构检测。 **迁移框架支持。** 原生支持 **Alembic**、**Django 迁移**、**Flyway**、**Liquibase**、**Prisma Migrate** 和 **Knex**。SlowQL 理解迁移文件的顺序、依赖关系和上下文,在破坏性更改影响您现有查询之前捕获它们。 **14 种 SQL 方言。** 针对 PostgreSQL、MySQL、SQL Server (T-SQL)、Oracle、SQLite、Snowflake、BigQuery、Redshift、ClickHouse、DuckDB、Presto、Trino、Spark 和 Databricks 的方言感知分析。通用规则在所有方言上触发;方言特定规则仅在相关时触发。 **架构感知验证。** 可选择根据您的 DDL 文件进行验证,捕获缺失的表、列,并建议索引。 **安全自动修复。** 保守的精确文本替换修复,使用 `FixConfidence.SAFE`。无需猜测,无需启发式重写。使用 `--diff` 预览,使用 `--fix` 应用。 **CI/CD 原生。** GitHub Actions、SARIF、pre-commit 钩子、JSON/HTML/CSV 导出。基于严重性阈值的退出代码。 **编辑器集成。** 通过 [slowql-vscode](https://marketplace.visualstudio.com/items?itemName=Makroumi.slowql-vscode) 提供 VS Code 扩展,以及用于其他编辑器的基础 LSP 服务器。 **应用代码 SQL 提取。** 自动提取并分析嵌入在 **Python**、**TypeScript/JavaScript**、**Java**、**Go**、**Ruby** 和 **MyBatis XML mapper** 文件中的 SQL 字符串。SlowQL 使用特定于语言的启发式方法(Python 的 AST,其他语言的 regex)和专用的 MyBatis XML 解析器来查找 SQL,标记动态构造中潜在的注入风险。它区分安全的 `#{param}` 参数化和不安全的 `${param}` 插值,并将在动态 MyBatis 标签(``、``、`` 等)中使用的查询标记为动态查询。 ## 安装 ### pipx(推荐) ``` pipx install slowql ``` ### pip ``` pip install slowql ``` ### Docker ``` docker run --rm -v $(pwd):/src makroumi/slowql /src/queries.sql ``` 要求:Python 3.11+、Linux / macOS / Windows。 ## 快速开始 ``` slowql queries.sql ``` 分析应用代码(自动提取 SQL 字符串): ``` slowql src/app.py src/services/ ``` 使用架构验证进行分析: ``` slowql queries.sql --schema schema.sql ``` 在 CI 模式下运行,设定失败阈值: ``` slowql init --dialect postgresql --fail-on high slowql src/ --fail-on high ``` ### 分析 MyBatis mapper 文件: ``` slowql src/main/resources/mapper/UserMapper.xml slowql src/main/resources/mapper/ --schema db/schema.sql ``` 预览并应用安全修复: ``` slowql queries.sql --diff slowql queries.sql --fix --fix-report fix-report.json ``` ### 探索规则目录 动态列出所有内置规则或获取特定规则的详细文档: ``` slowql --list-rules slowql --explain PERF-SCAN-001 ``` ### Python API 集成 只需三行代码即可将 SlowQL 直接集成到您的 Python 脚本中: ``` import slowql result = slowql.analyze("SELECT * FROM users") ``` ## 架构感知验证 SlowQL 通过检查您的 DDL 文件执行可选的架构感知验证。这可以捕获通用静态分析遗漏的结构性问题。 **表和列。** 检测对不存在的表或列的引用。 **索引建议。** 识别缺少相应索引的过滤列。 ``` slowql queries.sql --schema database/schema.sql slowql migrations/ --schema schema.sql --fail-on critical ``` 架构发现结果: | 规则 | 描述 | |------|-------------| | `SCHEMA-TBL-001` | 引用了表中未定义的表 | | `SCHEMA-COL-001` | 引用了表中不存在的列 | | `SCHEMA-IDX-001` | 为过滤列建议了缺失的索引 | SlowQL 附带 **282 条规则**,涵盖六个维度: | 维度 | 关注点 | 规则数 | |-----------|-------|------:| | 安全 | SQL 注入、权限提升、凭证暴露、SSRF | 61 | | 性能 | 全表扫描、索引、连接、锁定、排序、分页 | 73 | | 可靠性 | 防止数据丢失、事务、竞态条件、幂等性 | 44 | | 质量 | 命名、复杂性、空值处理、样式、dbt、死 SQL | 51 | | 成本 | 云仓库优化、存储、计算、网络 | 33 | | 合规 | GDPR、HIPAA、PCI-DSS、SOX、CCPA | 18 | ## MyBatis XML 支持 **MyBatis** 是一个流行的 Java/Spring ORM 框架,使用 XML mapper 文件定义 SQL 语句。SlowQL 现在可以解析这些 mapper 文件并应用所有现有 SQL 规则。 ### 支持的 MyBatis 标签 - ` SELECT * FROM users WHERE id = #{id} UPDATE users name = #{name}, email = #{email}, WHERE id = #{id} ``` SlowQL 将提取三条语句,标记 `SELECT *`(PERF‑SCAN‑001),标记不安全的 `${}`(SEC‑INJ‑001),并将更新标记为动态。 ### 相关规则 - `SEC‑INJ‑001` … `SEC‑INJ‑011` – 注入模式。 - `PERF‑SCAN‑001` – `SELECT *`。 - `QUAL‑DBT‑001` – 硬编码表名。 ## 方言特定规则 107 条规则是方言感知的,仅在相关数据库引擎上触发: | 方言 | 特定规则 | 示例 | |---------|---------------:|---------| | PostgreSQL | 12 | `pg_sleep` 检测、`SECURITY DEFINER` 没有 `search_path`、`CREATE INDEX` 没有 `CONCURRENTLY` | | MySQL | 15 | `LOAD DATA LOCAL INFILE`、`utf8` vs `utf8mb4`、`ORDER BY RAND()`、MyISAM 检测 | | T-SQL (SQL Server) | 23 | `OPENROWSET`、`sp_OACreate`、`@@IDENTITY`、`MERGE` 没有 `HOLDLOCK`、`SET NOCOUNT ON` | | Oracle | 11 | `UTL_HTTP`/`UTL_FILE`、`EXECUTE IMMEDIATE` 注入、`CONNECT BY` 没有 `NOCYCLE` | | Snowflake | 9 | `COPY INTO` 凭证、`WHERE` 中的 `VARIANT`、`CLONE` 没有 `COPY GRANTS` | | BigQuery | 6 | `SELECT *` 成本、`DISTINCT` on `UNNEST`、重复子查询 | | SQLite | 6 | `ATTACH DATABASE` 文件访问、`PRAGMA foreign_keys = OFF`、`AUTOINCREMENT` 开销 | | Redshift | 7 | `COPY` 包含嵌入凭证、`COPY` 没有 `MANIFEST`、`ISTSTYLE ALL` | | ClickHouse | 7 | `url()` SSRF、变更、`SELECT` 没有 `FINAL`、`JOIN` 没有 `GLOBAL` | | DuckDB | 3 | `COPY` 没有 `FORMAT`、大型 `IN` 列表、旧式转换 | | Presto / Trino | 4 | 隐式交叉连接、`INSERT OVERWRITE` 没有分区、`ORDER BY` 没有 `LIMIT` | | Spark / Databricks | 5 | 大表上的 `BROADCAST`、`WHERE` 中的 UDF、`CACHE TABLE` 没有过滤器 | 其余 175 条规则是通用的,在所有方言上触发。 ## 安全自动修复 SlowQL 为语义上 100% 等效的规则提供保守的零风险自动修复: ``` slowql queries.sql --diff slowql queries.sql --fix slowql queries.sql --fix --fix-report fixes.json ``` 自动修复原则: 1. 仅精确文本替换。无架构推断,无启发式重写。 2. 每个修复都标记有 `FixConfidence.SAFE`,意味着输出在功能上与输入完全相同。 3. 在写入之前始终创建 `.bak` 备份。 4. 修复可以在应用之前作为统一 diff 预览。 安全自动修复示例: | 规则 | 修复前 | 修复后 | |------|--------|-------| | `QUAL-NULL-001` | `WHERE x = NULL` | `WHERE x IS NULL` | | `QUAL-STYLE-002` | `EXISTS (SELECT * FROM t)` | `EXISTS (SELECT 1 FROM t)` | | `QUAL-MYSQL-003` | `LOCK IN SHARE MODE` | `FOR SHARE` | | `QUAL-TSQL-001` | `SET ANSI_NULLS OFF` | `SET ANSI_NULLS ON` | | `QUAL-ORA-002` | `SELECT 1 FROM DUAL` | `SELECT 1` | ## 内联抑制 可以使用直接写在 SQL 注释中的指令,按行、按块或按文件抑制规则。无需更改配置文件。 ``` SELECT * FROM archive; -- slowql-disable-line PERF-SCAN-001 -- slowql-disable-next-line SEC-INJ-001 SELECT id, token FROM sessions WHERE id = $1; -- slowql-disable PERF-SCAN SELECT * FROM event_stream; SELECT * FROM session_log; -- slowql-enable PERF-SCAN -- slowql-disable-file REL-001 ``` | 指令 | 范围 | |---|---| | `-- slowql-disable-line RULE-ID` | 仅当前行 | | `-- slowql-disable-next-line RULE-ID` | 下一个非空行 | | `-- slowql-disable RULE-ID` | 开放块直到匹配的 `enable` 或文件结束 | | `-- slowql-enable RULE-ID` | 关闭开放块 | | `-- slowql-disable-file RULE-ID` | 整个文件 | 规则 ID 可以是精确标识符、前缀、逗号分隔值,或完全省略以抑制该范围的所有规则。匹配不区分大小写。 ## 基线模式(差异模式) 基线模式允许您在现有的混乱代码库上采用 SlowQL,而不会被数千个初始警告淹没。这类似于 SonarQube 的"新代码周期"。 1. **创建基线:** 将您当前的所有问题存储在 `.slowql-baseline` 文件中。 slowql queries/ --update-baseline 2. **针对基线运行:** 现在,SlowQL 仅会标记基线创建**之后**引入的**新**问题。 slowql queries/ --baseline 由于问题通过内容哈希进行指纹识别,标准编辑(如追加空行)不会突然"取消抑制"您的基线问题。请参阅完整的[基线文档](docs/usage/baseline.md)了解 CI/CD 设置。 ## Git 感知分析 在 CI 环境中,每次提交都对数千个文件运行静态分析既缓慢又不必要。SlowQL 支持 git 感知分析,可以干净地跳过未更改的文件。 ``` # 仅分析已更改、已暂存或未跟踪的文件 slowql . --git-diff # 分析自分支脱离 main 以来的更改文件 slowql . --since main ``` ## CLI 用法 ### 主要标志 ``` --input-file Path to SQL file or directory --schema Path to DDL schema file --baseline Path to baseline file (suppress known issues) --update-baseline Update/create the baseline file --fail-on Failure threshold: critical, high, medium, low, info, never --interactive Opt-in to full interactive experience (animations, menus) when no inputs are provided --select-dialect Opt-in to prompt for dialect selection interactively --non-interactive (deprecated, now the default) Explicitly disable interactive mode --git-diff Only analyze files changed in the current workspace --since Analyze files changed since a specific git revision (e.g. main) --cache-dir Directory to store cache files (default: .slowql_cache) --no-cache Disable query result caching --clear-cache Clear cache directory before analysis --jobs, -j Number of parallel workers for analyzing multiple files. (0 = auto) --compare Enable query comparison mode ``` ### 输出控制 ``` --format Primary output: console, github-actions, sarif --export Export to disk: json, html, csv, sarif --out Directory for exported reports --diff Preview safe autofix diff --fix Apply safe autofixes (single file, creates .bak) --fix-report Write JSON report of fixes --list-rules List all 282 rules with severity, dimension, and dialect --list-rules --filter-dimension Filter by dimension (security, performance, etc.) --list-rules --filter-dialect Filter by dialect (postgresql, mysql, etc.) --explain RULE-ID Show full documentation for a specific rule ``` ### 退出代码 ``` 0 No issues found or issues below failure threshold 2 Issues found meet or exceed --fail-on threshold 3 Runtime error or tool failure ``` ## 配置 SlowQL 从 `slowql.toml`、`.slowql.toml`、`slowql.yaml`、`.slowql.yaml` 或 `pyproject.toml`(在 `[tool.slowql]` 下)发现配置。 ``` severity: fail_on: high warn_on: medium analysis: dialect: postgresql enabled_dimensions: - security - performance - reliability disabled_rules: - PERF-SCAN-001 severity_overrides: PERF-SCAN-001: info QUAL-NULL-001: critical # 配置从分析的目录或其任何父目录中发现 # 这允许项目特定和按目录的配置 schema: path: db/schema.sql output: format: console verbose: false show_fixes: true cost: cloud_provider: none compliance: frameworks: - gdpr ``` ## CI 集成 ### GitHub Action(官方) ``` - uses: slowql/slowql-action@v1 with: path: "./sql/**/*.sql" schema: "db/schema.sql" fail-on: high format: github-actions ``` ### CI 中的直接 CLI ``` - name: SlowQL Analysis run: | pip install slowql slowql --input-file sql/ --schema db/schema.sql --fail-on high --format github-actions ``` ### Pre-commit ``` repos: - repo: https://github.com/slowql/slowql rev: v1.6.2 hooks: - id: slowql args: [--fail-on, high] ``` ## 🔌 VS Code 扩展 从 VS Code Marketplace 安装 [slowql-vscode](https://marketplace.visualstudio.com/items?itemName=Makroumi.slowql-vscode),在编辑器中获取实时 SQL 分析。该扩展使用 SlowQL LSP 服务器进行诊断。 ### 查询复杂性评分 SlowQL 现在为每个分析的查询提供数值复杂性评分(0-100),帮助团队执行质量策略并跟踪复杂性趋势。 - **频谱分析:** 分数基于结构模式计算,如连接、子查询和聚合。 - **视觉反馈:** 终端输出突出显示查询复杂性,以帮助识别优化的候选对象。 #### 配置 您可以在 `.slowql.yml` 中启用/禁用复杂性评分,并为"最佳"、"复杂"和"关键"查询设置阈值: ``` complexity: enabled: true threshold_optimal: 40 threshold_complex: 70 ``` ## 架构 SlowQL 是一个模块化管道: ``` SQL Files → Parser (sqlglot) → AST → Analyzers → Rules → Issues → Reporters ↑ ↓ Schema Inspector AutoFixer (DDL parsing) (safe text fixes) ``` **解析器。** 使用 [sqlglot](https://github.com/tobymao/sqlglot) 进行多方言 SQL 解析。处理语句拆分、方言检测和 AST 生成。 **引擎。** 协调解析、分析器执行、架构验证和结果聚合。 **分析器。** 六个领域特定的分析器(安全、性能、可靠性、合规、成本、质量),每个都从目录加载规则。 **自定义规则。** 动态插件系统,在运行时从 YAML 文件(基于正则表达式)或 Python 模块(基于 AST)加载用户定义的规则。 **规则。** 282 条检测规则,实现为 `PatternRule`(正则表达式)、`ASTRule`(sqlglot AST 遍历)或自定义 `Rule` 子类。 **架构检查器。** 将 DDL 文件解析为架构模型。启用表/列存在性检查和索引建议。 **报告器。** 控制台(富 TUI)、GitHub Actions 注释、SARIF 2.1.0、JSON、HTML、CSV。 **自动修复器。** 保守的基于文本的修复引擎。仅基于跨度且精确文本替换。 ## 开发 ``` git clone https://github.com/slowql/slowql.git pip install -e ".[dev]" pytest ruff check . mypy src/slowql ``` ## 许可证 Apache License 2.0。请参阅 [LICENSE](LICENSE)。 **问题:** [github.com/slowql/slowql/issues](https://github.com/slowql/slowql/issues) **讨论:** [github.com/slowql/slowql/discussions](https://github.com/slowql/slowql/discussions)

返回顶部

标签:DevOps工具, Docker工具, LNA, SQL注入检测, SQL静态分析, Subfinder, VSCode插件, 代码安全, 合规检测, 开发安全, 性能优化, 成本优化, 检测绕过, 源代码检测, 漏洞枚举, 离线工具, 规则检测, 请求拦截, 逆向工具, 静态分析工具