讲师中心 微信公众号
AI工具推荐 视频效率加速

Python bandit 的自定义插件开发

雨丽酱_1131

雨丽酱_1131

发布时间:2026-02-22 20:01:03

|

194人浏览过

|

来源于php中文网

原创

bandit插件必须继承TestContext类,因其扫描器硬编码只识别该类为合法入口;run方法需手动遍历AST并检查ast.Call节点;插件须通过模块路径导入且仅含一个TestContext子类;confidence和severity须在add_issue中传字符串参数。

python bandit 的自定义插件开发

bandit 插件为什么必须继承 TestContext 类

因为 bandit 的扫描器在运行时只识别继承自 TestContext 的类作为合法插件入口,其他类名或函数定义会被直接忽略——哪怕路径正确、文件可导入。这不是配置问题,是硬编码的类型检查逻辑。

常见错误现象:bandit -r . -x my_plugin 完全没触发你的代码,bandit --list-plugins 里也看不到;但把类名改成 MyPlugin 并继承 TestContext 后立刻生效。

  • 必须显式写 class MyCustomTest(bandit.TestContext):,不能只写 def run(...)
  • 类名不需要匹配文件名,但必须唯一,否则后续插件会覆盖前一个
  • 不继承 TestContext 的模块即使被 -x 指定,bandit 也会静默跳过

如何让 run 方法真正捕获到危险函数调用

bandit 不是靠字符串匹配,而是基于 AST 遍历。你写的 run 方法必须手动遍历节点,并对 ast.Call 做判断——它不会自动帮你“检测所有 eval 调用”。

使用场景:比如你想拦截所有带 subprocess.Popen 且含 shell=True 的调用。

立即学习“Python免费学习笔记(深入)”;

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载
  • 必须在 run 中调用 self.visit(node)(通常放在 __init__ 或顶层逻辑里),否则 AST 遍历根本不会启动
  • 重写 visit_Call 方法时,要检查 node.func 是否为 ast.Attribute 或 ast.Name,再逐层取属性名,不能只看 node.func.id
  • 示例片段:
    if (isinstance(node.func, ast.Attribute) and
        isinstance(node.func.value, ast.Name) and
        node.func.value.id == 'subprocess' and
        node.func.attr == 'Popen'):
    然后继续检查 node.keywords 里有没有 shell=True

bandit.register 和插件路径加载的隐性规则

bandit 不支持任意路径导入插件。它只从 PYTHONPATH 或当前工作目录下的 bandit/plugins/ 子目录自动发现,或者靠 -x 显式指定模块路径(如 myproject.plugins.mytest),但该模块必须能被 Python 正常 import。

容易踩的坑:把插件文件放在 ./plugins/xxx.py,却没加 __init__.py,导致 import plugins.xxx 失败,bandit 报错 ImportError: No module named 'plugins'。

  • -x 后跟的是 Python 模块路径,不是文件路径,例如 -x mypkg.bandit_plugins.unsafe_eval
  • 模块中必须有且仅有一个继承 TestContext 的类,bandit 会自动实例化它
  • 如果插件依赖其他本地模块,确保它们也在 PYTHONPATH 中,否则 run 方法里 import 会失败,但错误可能被吞掉,只表现为“无报告”

为什么 confidence 和 severity 设置不生效

这两个字段不是在类定义里设的,而是在每次调用 self.add_issue(...) 时传进去的。bandit 插件里没有全局配置项,每个 issue 必须单独声明等级。

性能影响:设成 HIGH 不会变慢,但设错会导致报告被过滤——比如 CI 脚本用了 --severity-level medium,而你只打了 LOW,那条 issue 就不会出现在输出里。

  • 正确写法:self.add_issue(node, severity="HIGH", confidence="MEDIUM", text="unsafe shell=True")
  • 值只能是字符串 "LOW"/"MEDIUM"/"HIGH",大小写敏感,写成小写或数字会静默失败
  • 别试图在类属性里写 severity = "HIGH"——bandit 完全不读这个
插件里 AST 节点的 parent 关系不可靠,node.parent 在 bandit 里默认为空;需要自己维护上下文栈,否则判断嵌套调用(比如 eval(compile(...)))很容易漏判。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2864

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6184

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5969

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7574

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11314

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5819

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

6407

2025.08.07

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn