bandit默认不启用b307(eval)、b602(subprocess shell=true)等高危规则,需显式指定;safety默认返回0,须加--exit-code 1才报错;二者均受环境、路径、版本解析影响,ci中需统一配置并验证数据准确性。

bandit 扫描不报已知高危函数,比如 eval() 或 subprocess.Popen(..., shell=True)
bandit 默认只启用部分检测规则(test IDs),很多常见危险模式默认不开启。比如 eval() 检测对应 B101(assert used),但真正匹配 eval() 的是 B307;subprocess.Popen 带 shell=True 是 B602 —— 这俩在默认配置里常被忽略。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 运行时显式启用关键规则:
bandit -r . -x tests/ -s B307,B602,B110,B506(B110是try: ... except: pass,B506是base64.b64decode硬编码密钥) - 用配置文件统一管理:创建
.bandit,写入skips: []和tests: ["B307", "B602", "B110", "B506"],避免每次敲长命令 - 注意
bandit不分析字符串拼接后的动态调用(如func_name = "eval"; getattr(__builtins__, func_name)(x)),这类绕过它抓不到
safety 检查失败:提示 No such file or directory: 'requirements.txt' 却明明有文件
常见原因是当前工作目录不对,或 safety 无法识别非标准依赖声明路径(比如用了 Pipfile、pyproject.toml 或分环境的 requirements/dev.txt)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确认执行位置:
pwd输出是否真在含requirements.txt的目录?否则加-r指定路径:safety check -r ./reqs/production.txt -
safety本身不原生支持Pipfile或poetry.lock,需先导出为标准格式:pipenv requirements > requirements.txt或poetry export -f requirements.txt --without-hashes > requirements.txt - 如果项目用
pyproject.toml+poetry,别直接跑safety check,先poetry export -f requirements.txt --without-hashes | safety check --stdin
bandit + safety 联动时,CI 中漏掉 safety 的 exit code 判断
safety check 发现漏洞默认返回 0(成功),不是 1 —— 这和多数扫描工具相反。若 CI 脚本只靠命令返回值判断成败,safety 就永远“不报错”。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 必须加
--full-report或--output json配合--exit-code参数:safety check --exit-code 1 -r requirements.txt,这样有漏洞才返回非零值 - bandit 默认也是返回
0即使发现 issue,得加--exit-code:bandit -r . --exit-code 1 - 两个工具都建议加上
--quiet避免日志干扰 CI 解析,但保留错误输出(safety的--quiet会抑制所有输出,慎用)
为什么本地扫出问题,CI 里却没报?常见环境差异点
bandit 和 safety 对 Python 版本、依赖解析方式、文件编码、甚至换行符都敏感。最常踩的坑是依赖版本解析不一致。
实操建议:
立即学习“Python免费学习笔记(深入)”;
-
safety依赖pip show或requirements.txt解析版本号,如果 CI 用pip install -e .安装本地包,而setup.py里没写死依赖(比如用install_requires=["requests>=2.25"]),safety可能读不到实际安装版本 - bandit 在 CI 中若用容器运行,注意 Python 版本是否和本地一致 —— 某些检测(如
B322输入函数)在 Python 3.12+ 行为变化,旧版 bandit 可能跳过 - 确保 CI 使用的
requirements.txt是生成的(pip freeze > requirements.txt),而非手写的草稿,否则版本范围模糊会导致safety无法精确匹配 CVE 数据库










