使用 Bandit 作为 SAST 工具来保护您的 Python 应用

发布: (2025年12月6日 GMT+8 09:18)
8 min read
原文: Dev.to

Source: Dev.to

静态应用安全测试(SAST)工具可以在应用程序运行或部署之前直接在源代码中检测漏洞。本文将展示如何使用专注于 Python 的 SAST 工具 Bandit,对 Python 应用进行扫描并提升其安全姿态。

什么是 SAST 以及它为何重要

SAST 指的是在不运行应用程序的情况下,分析源代码、字节码或二进制文件以发现安全弱点的技术和工具。这些工具会搜索与不安全实践相关的模式,例如注入、危险的系统调用、弱加密或硬编码的机密信息。

在开发生命周期的早期运行 SAST,能够让团队在代码进入生产环境前发现并修复问题,从而降低风险和修复成本。将 SAST 集成到日常工作流(IDE 检查、pre‑commit 钩子或 CI/CD 流水线)可以把安全从后期的手动步骤转变为持续、自动化的实践。

认识 Bandit:Python 安全 Linter

Bandit 是一个开源的安全 Linter,旨在发现 Python 代码中的常见安全问题。它会解析 Python 文件,构建抽象语法树(AST),并运行一套安全测试,以检测以下问题:

  • 硬编码的密码
  • 使用不安全的函数,如 exec
  • 不安全的随机数生成器
  • 弱哈希算法
  • 风险较高的 XML 和子进程使用

由于 Bandit 能够理解 Python 的语法和惯用写法,它比通用的基于文本的扫描器提供更精确的发现。Bandit 通过 PyPI 分发,由 PyCQA 社区积极维护,且可以轻松集成到本地开发工作流和 CI/CD 流水线中。

在项目中设置 Bandit

  1. 创建虚拟环境(可选)

    python -m venv .venv
    source .venv/bin/activate   # On Windows: .venv\Scripts\activate
  2. 安装 Bandit

    pip install bandit
  3. 安装可选的扩展(例如 TOML 支持、基线管理、SARIF 输出)

    pip install "bandit[toml]" "bandit[baseline]" "bandit[sarif]"

安装完成后,bandit 命令即可在终端中使用。

使用 Bandit 扫描 Python 应用

  • 扫描单个文件

    bandit app.py
  • 递归扫描整个项目

    bandit -r .

Bandit 会输出报告,显示每个发现的问题,包括严重性、置信度、文件路径、行号以及简短描述。可以使用 -f 参数选择 JSON、XML、HTML、YAML 等输出格式,以便与仪表盘或存储系统集成。

理解 Bandit 的输出

Bandit 为每条发现分配两个关键属性:

  • Severity(严重性) – 潜在漏洞的危害程度(low、medium、high)。
  • Confidence(置信度) – Bandit 对该模式是真实安全问题的确信程度。

高严重性且高置信度的问题通常表明危险的模式,例如弱加密函数、不安全的临时文件、危险的 XML 解析器或使用不可信输入的 shell 命令。开发者应在具体上下文中审查这些发现,确认其有效性,并通过输入验证、参数化、替换弱算法或重构危险代码等方式进行修复。

在示例场景中使用 Bandit

设想一个小型的 Python Web 应用,它:

  • 执行文件操作
  • 调用外部命令
  • 处理用户输入

Bandit 可以帮助识别以下风险:

  • 使用不安全方法创建临时文件。
  • 将用户输入直接传递给 shell 命令或 SQL 查询。
  • 使用不安全的模块(如 telnetlib)或弱哈希函数(如 md5)。

在项目根目录运行 bandit -r .,即可显示这些模式的行号和解释,帮助在部署前重构代码。

将 Bandit 集成到 CI/CD

当 SAST 工具成为自动化流水线的一部分时,其真正价值才会显现。使用 Bandit,你可以添加一个 CI 作业,步骤如下:

  1. 安装依赖。
  2. 运行 bandit -r .
  3. 若出现新的高严重性问题,则使流水线失败。

示例(GitHub Actions)

name: Security Scan
on: [push, pull_request]

jobs:
  bandit-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'
      - name: Install Bandit
        run: pip install bandit
      - name: Run Bandit
        run: bandit -r . -f json -o bandit-report.json
      - name: Upload report
        uses: actions/upload-artifact@v3
        with:
          name: bandit-report
          path: bandit-report.json

你还可以配置 Bandit 输出 SARIF 并将其导入安全仪表盘,或使用基线文件将当前结果与之前的扫描进行比较,仅让新发现的问题导致构建失败。

使用 Bandit 的最佳实践

  • 将 Bandit 作为 pre‑commit 钩子在本地运行,提前捕获不安全模式。
  • 根据项目的风险容忍度调整严重性和置信度阈值,优先处理高影响的问题。
  • 定期审查并更新配置文件(如 .bandit.yml),以排除误报或定义项目特定规则。
  • 将 Bandit 与其他安全实践结合使用,如依赖扫描、动态测试和人工代码审查。

Bandit 并非万能钥匙,但它是一种轻量且有效的方式,能够将安全意识融入日常的 Python 开发中。

局限性与补充工具

Bandit 侧重于对 Python 源代码的静态分析,并不能取代动态应用安全测试或运行时防护。它可能遗漏需要深入业务规则理解的复杂逻辑问题,因此人工审查仍然必不可少。

为了构建更完整的安全策略,可以将 Bandit 与以下工具结合使用:

  • 检查开源依赖的工具(如 pip-auditsafety)。
  • 对运行环境进行动态扫描。
  • 监控生产系统的运行时威胁。

即使存在这些局限,将 Bandit 作为 Python 的 SAST 工具集成进来,也能以相对低的成本显著提升应用的安全基线。

Back to Blog

相关文章

阅读更多 »

Blender 插件开发需要更多 DevOps

概述 编写测试代码并实现自动化。在多个版本的 Blender 上运行测试,以安心发布。个人开发者,无论是已经是还是想成为 d...