Python 静态分析
Python 栈的 L1 静态分析由 4 个 skill 协同,覆盖安全、风格、类型、SAST 四个维度。
| Skill | 维度 | 一句话描述 |
|---|---|---|
| bandit | 安全 | Python 安全漏洞扫描(SQL 注入 / 命令注入 / 硬编码密钥 / 不安全函数) |
| ruff | 风格 + 复合 | Python 极速 lint(替代 Flake8/Pylint/isort/Black,900+ 规则,Rust 编写) |
| mypy | 类型 | Python 类型检查(类型不匹配 / 缺失注解 / 不兼容赋值,PEP 484 参考实现) |
| semgrep | SAST | 跨语言 SAST(SQL 注入 / XSS / 密钥泄露 / taint tracking,Python 也覆盖) |
bandit
用途:Python 专用安全漏洞扫描器。
| 检测类型 | 示例 |
|---|---|
| SQL 注入 | 字符串拼接构造 SQL |
| 命令注入 | subprocess(shell=True) |
| 硬编码密钥 | 代码中的 api_key = "sk-..." |
| 不安全函数 | pickle.loads / eval / yaml.load 无安全参数 |
| 弱加密 | MD5/SHA1 用于密码 |
触发:"Python 安全扫描"、"bandit 检查"、"有没有 SQL 注入风险"
ruff
用途:Python 生态最快的 lint(Rust 实现),几乎取代 Flake8 + Pylint + isort + Black。
- 900+ 规则
- 秒级扫描大型项目
- 规则分组可配置:
E(pycodestyle errors)/W(warnings)/F(pyflakes)/I(isort)/N(naming)等 - 可替代
black做格式化
触发:"Python lint"、"代码风格检查"、"ruff 跑一下"
mypy
用途:PEP 484 参考实现的 Python 静态类型检查器。
| 检测项 | 示例 |
|---|---|
| 类型不匹配 | def f(x: int) -> str: return x |
| 缺失注解 | 函数参数 / 返回值无类型 |
| 不兼容赋值 | a: list[int] = ["x"] |
| Optional 忽略 | 对 Optional[T] 不做 None check |
触发:"Python 类型检查"、"mypy 报错"、"类型不一致"
semgrep
用途:跨语言(不止 Python)语义级 SAST 扫描,支持自定义 YAML 规则。
| 检测类型 | 说明 |
|---|---|
| SQL 注入 / XSS | 常见 OWASP |
| 密钥泄露 | 硬编码凭据 |
| Taint tracking | 跟踪不可信输入到危险 sink |
| 自定义规则 | 企业特有安全规则 |
与 bandit 的区别:bandit 聚焦 Python 特定模式;semgrep 是规则可编程的语义引擎,覆盖 Python/Java/JS/Go/Ruby 等多语言。
触发:"SAST 扫描"、"写一条自定义规则"、"跨语言安全检查"
组合使用建议
L1 扫描完 → 输出 CodeEvidence → 交给 code-review 做 L2 语义评审。