尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Bandit CSV 报告格式器解析:将 Python 安全扫描结果导出为机器可读的 CSV 文件
SAST应用安全【免费下载链接】banditBandit is a tool designed to find common security issues in Python code.项目地址https://gitcode.com/gh_mirrors/ba/bandit点击查看免费下载Bandit 内置的 CSV 格式器csvformatter负责把静态安全扫描发现的问题以逗号分隔值CSV格式输出是自动化集成、结果入库和报表统计场景的关键环节。本文围绕 CSV 格式器的输出规范展开结合 格式器源码、CLI 入口 与 单元测试完整讲清它的字段结构、调用链路、版本演进以及实际的命令行用法读完后可直接在 CI 流水线中生成可被 pandas、Excel 或任何 CSV 解析器直接消费的安全报告。一、格式器注册bandit -f csv从何而来Bandit 的所有报告格式器都以插件形式加载。CSV 格式器在 setup.cfg 的[entry_points]段中通过bandit.formatters组注册[entry_points] bandit.formatters csv bandit.formatters.csv:report json bandit.formatters.json:report txt bandit.formatters.text:report xml bandit.formatters.xml:report html bandit.formatters.html:report sarif bandit.formatters.sarif:report screen bandit.formatters.screen:report yaml bandit.formatters.yaml:report custom bandit.formatters.custom:report注册键名csv就是命令行--format-f可选的取值。在 bandit/cli/main.py 中-f/--format参数的可选值并非硬编码而是动态取自已加载的扩展管理器parser.add_argument( -f, --format, destoutput_format, actionstore, defaultoutput_format, helpspecify output format, choicessorted(extension_mgr.formatter_names), )因此只要第三方包按同样方式注册bandit.formatters入口点就能扩展出新的输出格式-f的可选列表会自动包含它。需要说明的是输出格式有一个默认值逻辑当标准输出是终端TTY、未设置NO_COLOR环境变量且TERM ! dumb时默认用screen带彩色高亮重定向到文件或管道时默认回退为txt。也就是说bandit examples/ report.txt与bandit -f txt examples/效果一致而要用 CSV 必须显式指定-f csv。二、命令行实战用法结合 bandit/cli/main.py 的参数定义CSV 输出的核心用法如下# 对示例目录扫描输出 CSV 到标准输出 bandit -r examples/ -f csv # 将 CSV 报告写入文件-o 指定输出文件 bandit -r examples/ -f csv -o report.csv # 只报告 MEDIUM 及以上严重级别、MEDIUM 及以上置信度的问题 bandit -r examples/ -f csv -ll -ii -o report.csv # 或使用字符串形式指定阈值 bandit -r examples/ -f csv --severity-level medium --confidence-level high几个与 CSV 输出直接相关的 CLI 细节均出自 bandit/cli/main.py 源码-o/--output以 UTF-8 编码打开的文件对象默认是sys.stdout。CSV 格式器内部会判断输出目标是否为 stdout若是文件则记录一条CSV output written to file: ...的日志方便在 CI 日志中确认落盘位置。-l/--level与-i/--confidence使用actioncount-l对应 LOW、-ll对应 MEDIUM、-lll对应 HIGH字符串形式--severity-level all/low/medium/high会被映射为相同的数值等级。这两个值最终作为sev_level/conf_level传入格式器决定了 CSV 中会写入哪些问题。退出码约定扫描发现满足过滤条件的问题时进程以1退出--exit-zero可强制返回 0。在 CI 中若只是生成 CSV 报告而不希望其阻塞流水线需要加--exit-zero或在 shell 中容忍非零退出码。--baseline限制基线对比只接受 JSON 格式的基线文件且要求输出格式是支持基线的格式器CSV 不在--baseline的可用格式列表中因此不能把 CSV 报告本身再用作基线。三、输出字段规范12 列的完整结构CSV 报告的列由 bandit/formatters/csv.py 中的fieldnames列表唯一确定且表头始终写在第一行fieldnames [ filename, test_name, test_id, issue_severity, issue_confidence, issue_cwe, issue_text, line_number, col_offset, end_col_offset, line_range, more_info, ]各列含义如下列名含义取值示例filename产生问题的源文件路径examples/yaml_load.pytest_name检测规则插件或黑名单项的名称blacklist_callstest_id规则 IDB301issue_severity严重级别LOW / MEDIUM / HIGHMEDIUMissue_confidence置信级别LOW / MEDIUM / HIGHHIGHissue_cwe关联的 CWE 条目Mitre 链接无 CWE 则为空https://cwe.mitre.org/data/definitions/502.htmlissue_text问题描述文本Use of unsafe yaml load. ...line_number问题所在起始行号9col_offset问题所在起始列偏移4end_col_offset问题结束列偏移20line_range问题覆盖的行号列表Python list 字符串表示[9]more_info该规则在 Bandit 官方文档中的页面 URLhttps://bandit.readthedocs.io/en/latest/官方文档给出的示例输出来自 doc/source/formatters/csv.rst 所引用的模块 docstring大致如下filename,test_name,test_id,issue_severity,issue_confidence,issue_cwe, issue_text,line_number,line_range,more_info examples/yaml_load.py,blacklist_calls,B301,MEDIUM,HIGH, https://cwe.mitre.org/data/definitions/20.html,Use of unsafe yaml load. Allows instantiation of arbitrary objects. Consider yaml.safe_load(). ,5,[5],https://bandit.readthedocs.io/en/latest/这里有一个值得注意的细节该文档示例是历史版本留下的比当前实现少了col_offset和end_col_offset两列。从 bandit/formatters/csv.py 的fieldnames定义可以确认当前版本的 CSV 输出固定为 12 列。撰写解析脚本时应以源码中的字段列表为准而不是以旧版示例的列数为准。另外CSV 输出不包含问题代码上下文格式器调用result.as_dict(with_codeFalse)即Issue.as_dict()中的with_codeTrue分支会附带code字段由 bandit/core/issue.py 的get_code()生成在 CSV 路径上被显式关闭这也是extrasactionignore参数的意义之一——即使字典里多出code键DictWriter也会安全地忽略它。四、实现链路剖析4.1report()函数与结果过滤CSV 格式器的入口函数签名为def report(manager, fileobj, sev_level, conf_level, lines-1): results manager.get_issue_list( sev_levelsev_level, conf_levelconf_level ) with fileobj: writer csv.DictWriter(fileobj, fieldnamesfieldnames, extrasactionignore) writer.writeheader() for result in results: r result.as_dict(with_codeFalse) r[issue_cwe] r[issue_cwe][link] r[more_info] docs_utils.get_url(r[test_id]) writer.writerow(r)以上为基于 bandit/formatters/csv.py#L41-L82 的整理调用链如下report()接收 Bandit 管理器对象通过 bandit/core/manager.py 的get_issue_list()取问题列表后者直接委托给filter_results()先按sev_level/conf_level过滤每个Issue.filter()结果若加载了基线还会做基线比对。严重度/置信度的可比顺序由 bandit/core/constants.py 中的RANKING [UNDEFINED, LOW, MEDIUM, HIGH]定义因此-llMEDIUM会保留 MEDIUM 与 HIGH 两级的问题。遍历结果时Issue.as_dict()见 bandit/core/issue.py把每个问题转为与上表列名基本一致的字典其中issue_cwe初始是一个{id: ..., link: ...}字典。CSV 格式器把issue_cwe从字典降维为纯链接字符串无 CWE 时为空串由Cwe.link()的NOTSET分支决定保证 CSV 单元格是扁平的标量值。more_info一列由 bandit/core/docs_utils.py 的get_url()生成它以https://bandit.readthedocs.io/en/{当前版本号}/为基址先查插件注册表命中则拼出plugins/{test_id}_{插件名}.html页面地址未命中插件则查黑名单表按blacklists/blacklist_calls.html或blacklist_imports.html的规则条目锚点拼接对B304/B305、B313–B320这类合并页面做了特判两者都查不到时回退为文档首页地址。这意味着 CSV 中每条问题都能一键跳转到对应规则的详细说明页适合直接分发给非安全团队的读者。4.2 文件对象管理与一个历史遗留细节两个实现细节解释了源码中看似“多余”的代码with fileobj:report()会关闭传入的文件对象。CLI 路径下-o打开的文件由此处统一关闭而sys.stdout本身支持上下文管理器直接传入也安全。Python 2 时代的导入说明bandit/formatters/csv.py 顶部有一段注释解释本模块命名为csv后与标准库csv同名在 Python 2 下以from bandit.formatters import csv方式导入会遮蔽标准库模块内部因此使用绝对导入import csv。项目当前只支持 Python 3见 setup.cfg 的Programming Language :: Python :: 3分类器这段注释属于历史兼容说明但阅读源码时看到模块名与导入名不一致并不矛盾。模块末尾if fileobj.name ! sys.stdout.name: LOG.info(...)依赖fileobj.name属性即输出目标必须是带name的常规文件对象-o或测试中的临时文件单元测试 tests/unit/formatters/test_csv.py 正是通过tempfile.mkstemp()创建真实文件来覆盖这条日志分支的。五、字段演进史从 9 列到 12 列模块 docstring 中保留了 CSV 格式器的完整版本沿革随 Sphinxautomodule渲染进 文档页版本变化0.11.0CSV 格式器随versionadded引入1.5.0新增more_info列输出规则文档链接1.7.3新增issue_cwe列输出 CWE Mitre 链接再加上当前源码中的col_offset/end_col_offset两列用于精确定位问题代码片段常见于与编辑器或 LSP 集成时做跳转高亮形成了如今的 12 列结构。对下游消费方的启示是解析 CSV 时应以表头行为准动态取列不要硬编码列数这样在 Bandit 大版本升级后脚本不会断裂。六、测试如何验证 CSV 输出单元测试 tests/unit/formatters/test_csv.py 展示了验证 CSV 格式器的标准姿势也侧面确认了字段契约def test_report(self): with open(self.tmp_fname, w) as tmp_file: b_csv.report(self.manager, tmp_file, self.issue.severity, self.issue.confidence) with open(self.tmp_fname) as f: reader csv.DictReader(f) data next(reader) self.assertEqual(self.issue.severity, data[issue_severity]) self.assertEqual(self.issue.confidence, data[issue_confidence]) self.assertEqual(str(self.context[lineno]), data[line_number]) self.assertEqual(str(self.context[linerange]), data[line_range]) self.assertIsNotNone(data[more_info]) self.assertEqual(str(self.issue.col_offset), data[col_offset])测试构造了一个hardcoded_bind_all_interfaces的Issue含col_offset8、end_col_offset16、linerange[4]写入临时文件后用标准库csv.DictReader回读并逐列断言覆盖了filename、issue_severity、issue_confidence、issue_text、line_number、line_range、test_name、more_info、col_offset、end_col_offset等关键列。这也说明 CSV 输出严格遵循 RFC 风格的引号转义——像issue_text这类可能含逗号、换行的描述字段会被csv模块自动加引号包裹如文档示例中的Use of unsafe yaml load. ...。七、与其他格式器的定位差异及选型建议CSV 在 doc/source/formatters/index.rst 所列的格式器家族中定位清晰screen/txt面向人类阅读带彩色/纯文本排版含代码上下文json结构最完整支持 baseline、嵌套issue_cwe对象适合程序二次处理与 API 集成sarif面向静态分析结果交换标准SAST 工具生态集成csv面向表格化工具与轻量数据流每行一条扁平化记录可直接被 Excel、Google Sheets、pandasread_csv、数据库导入工具消费custom通过--msg-template自定义消息模板仅支持{abspath}、{line}、{test_id}等有限标签适合日志风格输出。选型建议CI 中归档报告bandit -r path -f csv -o report.csv --exit-zero再把 CSV 作为构建产物上传注意 CSV 不能用于--baseline增量扫描仍应以 JSON 报告为基线文件。用 pandas 做安全指标统计直接pd.read_csv(report.csv)按issue_severity/test_id分组即可得到各规则命中量line_range列是字符串化的 Python 列表如[5, 6]需要时用ast.literal_eval还原。多项目汇总入库CSV 的扁平结构天然适合 append 式入库filenametest_idline_number可组合成去重键与 bandit/core/issue.py 中Issue.__eq__的比对字段思路一致后者用text/severity/cwe/confidence/fname/test/test_id判断同一问题。链接可达性more_info与issue_cwe均为外链内网环境消费 CSV 时应将这两列视为“提示性”数据而非强依赖。小结Bandit 的 CSV 格式器是一个“小而稳定”的组件通过 setup.cfg 的 entry point 注册为csv由 bandit/formatters/csv.py 的report()函数实现输出固定 12 列、表头恒定、不含代码上下文的扁平问题清单issue_cwe与more_info两列分别指向 CWE 定义与 Bandit 规则文档。理解它的字段来源Issue.as_dict()→ CWE 链接降维 →docs_utils.get_url()补链与过滤链路get_issue_list()→filter_results()→RANKING排序就能在 CI、报表脚本和数据库集成中可靠地消费 Bandit 的 CSV 报告。赞分享SAST应用安全【免费下载链接】banditBandit is a tool designed to find common security issues in Python code.项目地址https://gitcode.com/gh_mirrors/ba/bandit点击查看免费下载相关推荐Gobuster结果导出为CSV电子表格分析扫描数据Gobuster结果导出为CSV电子表格分析扫描数据 痛点与解决方案 你是否还在为Gobuster扫描结果难以统计分析而烦恼当目录扫描返回数百条结果时手动网络安全渗透测试零代码体验 OmniVoice 语音克隆 TTSColab、HuggingFace Space 与本地 Web Demo 三种方式全解析零代码体验 OmniVoice 语音克隆 TTSColab、HuggingFace Space 与本地 Web Demo 三种方式全解析 OmniVoice人工智能语音音频预训练免费船舶设计软件FREE!ship Plus从零开始设计专业船型的完整指南免费船舶设计软件FREE!ship Plus从零开始设计专业船型的完整指南 你是否梦想设计自己的船舶但被昂贵的专业软件所困扰FREE!ship Plus为桌面应用科学计算科研上一篇Linux 内核 IRQ 基础概念解读从设备中断请求到 IRQ 号的完整映射下一篇WTF Solidity 代理合约Proxy Contract详解用 delegatecall 实现可升级与省 Gas 的合约架构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

将 Hunk 接入 Git:pager 与 difftool 完整配置指南

将 Hunk 接入 Git:pager 与 difftool 完整配置指南

开发工具代码评审CLIAI 应用 【免费下载链接】hunk Review-first terminal diff viewer for agentic coders 项目地址: https://gitcode.com/gh_mirrors/hu/hunk 点击查看 免费下载 Hunk 是一款面向 Agent 化开发者的终端 diff 查看器(Review-first ter…

📅 2026/9/25 17:46:44
EMQX 规则引擎 republish 动作的 Namespace 隔离修复:limit_selects_in_namespace 行为详解

EMQX 规则引擎 republish 动作的 Namespace 隔离修复:limit_selects_in_namespace 行为详解

后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读 本文围绕 EMQX 规则引擎(Rule Engi…

📅 2026/9/25 17:46:44
Apache Beam GCP 安全日志分析器:从 Log Sink 配置到每周 IAM 安全告警的自动化实践

Apache Beam GCP 安全日志分析器:从 Log Sink 配置到每周 IAM 安全告警的自动化实践

大数据批处理流处理数据工程 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam 点击查看 免费下载 Apache Beam 仓库的 infra/security 模块 实现…

📅 2026/9/25 17:46:44
MORE NEWS

更多资讯

📰

IndexedDB 本地数据库

5.4 IndexedDB 本地数据库IndexedDB 是浏览器原生提供的事务型结构化本地数据库,专为解决 Web Storage 容量上限低、仅支持字符串存储、查询能力弱的问题。它支持大容量存储、索引查询、事务处理,能够存储海量结构化业务数据与二进制资源,是复…

📰

2026 最新|Claude Code 支付失败排查:从 card_declined 到订阅状态机的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

简单聊聊 API 网关是什么:从 Cline 配置 TaoToken 统一 Key 通道说起

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Oracle / PL SQL: CURSOR FOR LOOP 使用与 TaoToken 配置排错指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

数据治理第十五篇:五阶段标准实施路径——从制度上墙到长效运营的落地闭环

一、承接前文闭环:从「有规则、有考核」走向「能落地、能运营」在前两篇连载中,我们已经完成数据治理两大核心体系的搭建:第13篇构建了制度规范体系,解决了治理“有据可依”的问题;第14篇落地了KPI考核度量体系&#x…

📰

Atlas 300V 24G部署YOLO推理全流程:从环境搭建到性能优化

1. 项目概述:一张24G显存的加速卡,凭什么承接YOLO推理先回答碰到最多的那个问题:Atlas 300V 24G是运算加速卡吗?是的,而且是专门为AI推理场景设计的加速卡。很多第一次接触昇腾生态的朋友,看到“Atlas 300V…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬