Python依赖安全检查:Safety工具实战指南与最佳实践
目录导读
为什么Python项目需要依赖安全检查?
现代Python项目平均依赖超过80个第三方库,这些库可能包含已知漏洞(CVE),据统计,2023年PyPI上公布的漏洞数同比增长40%。依赖安全检查已成为DevSecOps流程中不可或缺的环节。

关键风险点:
- 过时版本:如Django 2.2.x(已停止安全更新)
- 供应链攻击:恶意包植入后门(如2022年的
colorama误植事件) - 传递依赖:你的依赖的依赖可能含漏洞
Safety工具的核心功能与原理
Safety是Python官方推荐的依赖安全检查工具之一,核心能力包括:
1 工作原理
- 读取
requirements.txt或Pipfile中的包名+版本 - 与Safety数据库(基于PyUP官方漏洞库)对比
- 输出已知CVE编号、漏洞等级、受影响的版本范围
2 核心优势
- 零配置:直接运行即生成报告
- 离线支持:可下载漏洞数据库到本地
- CI友好:支持JSON、HTML、CSV多种输出格式
3 基础命令示例
# 扫描requirements.txt safety check -r requirements.txt # 生成忽略某些漏洞的报告 safety check --ignore 44715,44716 -r requirements.txt
安装与基础使用教程
1 安装Safety
pip install safety # 或使用pipx隔离安装 pipx install safety
2 基础扫描
# 扫描当前环境的已安装包 safety check # 扫描特定依赖文件 safety check -r requirements.txt # 输出JSON格式报告(便于自动化处理) safety check -r requirements.txt --json
3 理解输出结果
典型输出包含:
- 漏洞ID:如
44715对应CVE-2023-25194 - CVSS评分:0-10分(>=7为高危)
- 受影响的包:
django<3.2.18 - 修复建议:升级到>=3.2.18
进阶用法:集成CI/CD与自动化扫描
1 与GitHub Actions集成
在.github/workflows/security.yml中添加:
name: Dependency Security Check
on: [push, pull_request]
jobs:
safety:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Safety
run: |
pip install safety
safety check -r requirements.txt --json > safety_report.json
- name: Upload Report
uses: actions/upload-artifact@v3
with:
name: safety-report
path: safety_report.json
2 本地自动化脚本
#!/bin/bash # 每日凌晨执行扫描并发送告警 safety check -r requirements.txt --json | \ jq '.vulnerabilities[] | select(.severity == "CRITICAL")' | \ mail -s "高危依赖漏洞提醒" team@example.com
3 忽略误报
某些漏洞在当前使用场景下无风险,可通过.safety-ignore文件忽略:
44715 # 已知误报,不影响我们的业务逻辑
Safety的局限性与替代方案对比
| 工具 | 数据源 | 离线支持 | CI集成 | 核心局限性 |
|---|---|---|---|---|
| Safety | PyUP官方库 | ✅ 支持 | ✅ 良好 | 数据库更新略慢(偶有漏报) |
| pip-audit | PyPI + OSV | ✅ 支持 | ✅ 原生 | 声明式扫描较弱 |
| bandit | 自身规则 | 仅检查代码,不检查依赖 | ||
| Snyk | 商业数据库 | ❌ 需网络 | ✅ 完善 | 高级功能收费 |
| OWASP DC | NVD数据库 | ✅ 良好 | Java/JS为主,Python支持有限 |
选择建议:
- 免费团队:Safety + pip-audit 组合扫描
- 商业需求:Snyk提供更完整的供应链安全
常见问题(Q&A)
Q1:Safety能检测所有Python依赖漏洞吗?
A:不能,Safety依赖PyUP数据库,该数据库主要收录PyPI官方发布的漏洞,对于通过GitHub或其他私有源安装的包,需要结合其他工具(如GitHub Dependabot)覆盖。
Q2:如何处理Safety报告的误报?
A:通过--ignore参数或.safety-ignore文件忽略特定漏洞,但需确保:
- 确认该漏洞在当前代码路径中不可利用
- 定期复查忽略列表
Q3:Safety检查会修改我的依赖文件吗?
A:不会,Safety是只读工具,仅生成报告,如需自动修复,可结合pip-audit的--fix功能或手动升级。
Q4:大型项目扫描速度慢怎么办?
A:可使用以下优化:
--cache参数启用缓存- 分模块扫描:
safety check -r req_core.txt(仅扫描核心依赖) - 使用JSON输出减少格式处理开销
Q5:Safety与Dependabot有什么区别?
A:Dependabot是GitHub原生服务,自动创建PR更新依赖;Safety是独立CLI工具,更灵活但需手动集成,两者不冲突,可配合使用。
最佳实践总结:
- 每周至少执行一次Safety扫描
- 高危漏洞(CVSS>=9)应在24小时内修复
- 将Safety集成到pre-commit git hook中
- 结合
pip-audit作为二次验证
通过系统化运用Safety,开发者可以将依赖安全风险降低80%以上,安全不是一次性检查,而应成为持续交付流程的内置基因。