为什么Python Web应用需要定期进行依赖包的安全漏洞扫描?
pip-audit是PyPA官方维护的轻量级依赖扫描工具,对接NVD和GitHub Advisory数据库,支持环境扫描、requirements.txt及pyproject.toml,输出CVE详情并可JSON集成CI。
因为不扫,你根本不知道自己正在用一个带后门的 requests 替身包,或者一个能被远程执行代码的 numpy 旧版本。
依赖包不是“装完就安全”的静态组件
Python项目里每个直接安装的包(比如 flask、django)背后都连着十几甚至上百个间接依赖。这些依赖不会主动告诉你它悄悄升级了、换人维护了、或被投毒了。一个 pip install 命令可能在你不知情时拉下恶意 setup.py 执行逻辑——比如那个名字只差一个数字的 reques7s。
- PyPI 允许任何人发布同名/近似名包,没有人工审核
- 依赖树越深,手动审计越不可行;
pipdeptree --warn fail只能看出冲突,看不出漏洞 - 很多 CVE 漏洞(如
Django < 4.2.10的 XSS)只影响特定小版本,不扫描根本无法感知
pip-audit 是目前最轻量且可信的扫描入口
它由 PyPA 官方维护,直接对接 NVD 和 GitHub Security Advisory 数据库,不依赖商业订阅,也不需要你改代码或加装饰器。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
- 扫描当前环境所有已安装包:
pip-audit - 只扫
requirements.txt文件(推荐 CI 中使用):pip-audit -r requirements.txt - 输出含 CVE ID、严重等级和受影响版本范围,比如
PYSEC-2023-123对应requests==2.20.0 - 支持
--json输出,方便集成到 GitHub Actions 或 Jenkins 做门禁:高危漏洞自动阻断 PR 合并
safety 和 pip-audit 别混着用,尤其别信免费版 safety 的数据库
safety 的免费数据库(pyup.io)更新滞后,2025 年底起已不再同步 NVD 新增条目;而 pip-audit 默认使用 GitHub Advisory + PyPI 官方漏洞 API,覆盖更全、响应更快。
- 如果你用
safety check --full-report却没看到某个已知 CVE,大概率是数据库没同步,不是没漏洞 -
safety不支持pyproject.toml中的依赖解析,遇到现代项目容易漏报 -
pip-audit能处理 PEP 621 格式,也支持poetry export -f requirements.txt导出的锁定文件
真正容易被忽略的点是:扫描必须覆盖构建环境本身——CI 流程里用的 Python 镜像、预装的工具链(如 setuptools、wheel),也可能存在漏洞。别只盯着应用层依赖。