首页/开发/代码质量与评审速查/Bandit:Python 安全静态检查
规范与静态检查65 条

Bandit:Python 安全静态检查

Bandit 扫描 Python 代码中的安全模式:测试编号如 B101(assert 用于校验)、B301(pickle)、B602(subprocess shell=True)。

Bandit 是什么

Bandit 是 Python 的安全静态检查工具(SAST):按编号匹配常见危险写法,比如在安全校验中使用 assert、反序列化不可信数据、以 shell 方式执行子进程。它不做动态测试,也不判断业务逻辑是否成立,只把可疑位置按严重级别与置信度列出来,交给人确认。

基本信息

定位Python 安全静态检查(SAST)
典型判定assert 用于校验、pickle 反序列化、shell 方式执行命令
输出维度严重级别与置信度
接入方式命令行、提交钩子、CI 步骤

典型使用场景

  • 上线前安全自查:快速定位高危写法
  • 评审辅助:把扫描结果贴进改动里作为参考
  • CI 门禁:按严重级别设定阻断条件
  • 老代码梳理:按模块分批处理历史告警
  • 与依赖漏洞扫描配合:一个看代码写法,一个看依赖版本

结果怎么排序处理

  • 先看高严重且高置信度的条目
  • 确认可达性:这段代码是否真的会被调用
  • 能修的直接换写法,例如用显式判断替代 assert
  • 确实无法修的,记录理由并在配置里豁免

常用命令

常用命令
bandit -r src/                      # 递归扫描目录
bandit -r src/ -ll                  # 只看高危或高置信度
bandit -r src/ -f json -o bandit.json
bandit -r src/ --skip B101          # 按编号跳过确认为误报的检查

典型判定与含义

编号问题风险
B101用 assert 做校验优化模式下断言会被整段移除
B301反序列化不可信数据可能构造任意对象
B602以 shell 方式执行子进程命令注入
B105硬编码口令字符串凭据随代码一起扩散
assert 在优化模式下会被移除:用它做参数校验或权限检查,运行环境一变就会静默失效。
在评审中的用法:把扫描结果当成参考而不是结论,先判断代码路径是否真的可达,再决定修复还是豁免。
误报的判断标准是可利用性:同一条规则在不同上下文里风险差别很大,先看数据来源是否可信,再决定修复优先级。
接入 CI 时按严重级别设门槛:低级别只做提示,高级别直接阻断,避免把团队推向整体豁免。
用豁免注释抹掉告警:扫描失去意义,真实问题也一起被掩盖。

易错点

  • 用豁免注释抹掉告警:扫描失去意义,真实问题一起被掩盖
  • 只在发布前跑一次:修复成本随阶段上升,还容易带着风险上线
  • 把静态扫描当成渗透测试:它只覆盖已知的危险写法
  • 发现硬编码口令后只删代码:凭据依然有效,必须先轮换
  • 把扫描结果不分级地全部贴进任务系统:真正高危的条目被几十条提示淹没

数据来源与参考

  • Bandit 官方文档(bandit.readthedocs.io)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌