新闻详情

新闻详情

首页 / 资讯中心 / 详情

Bandit B704 检测指南:markupsafe.Markup 的不安全使用与 XSS 防护配置

发布时间:2026/9/26 2:14:55来源:尧图网络
Bandit B704 检测指南:markupsafe.Markup 的不安全使用与 XSS 防护配置
SAST应用安全【免费下载链接】banditBandit is a tool designed to find common security issues in Python code.项目地址https://gitcode.com/gh_mirrors/ba/bandit点击查看免费下载导读本文围绕 Bandit 安全扫描器的 B704 测试markupsafe_markup_xss展开介绍它如何识别markupsafe.Markup构造时传入动态内容f-string、变量、插值字符串等所导致的跨站脚本XSS风险并详细讲解markupsafe_xss配置段中的extend_markup_names与allowed_calls两个扩展选项以及对应的告警输出格式、绕过场景与功能测试验证。读完本文你将掌握 B704 的检测原理、告警含义、如何在 bandit.yaml 中为自有框架定制检测范围以及如何结合源码准确判断哪些写法会被误报或漏报。B704 检测的定位与引入版本B704 是 Bandit 内置插件之一源码位于 bandit/plugins/markupsafe_markup_xss.py自 Bandit1.8.3 版本起引入versionadded:: 1.8.3。它针对markupsafe库的Markup类使用场景检测将动态、不可信内容直接传入Markup构造这一潜在 XSS 风险因此相关文档被收录在 doc/source/plugins/b704_markupsafe_markup_xss.rst。核心原理为什么 Markup() 是 XSS 风险点markupsafe.Markup是 Python Web 框架如 Flask、Jinja2中用于标记字符串已被转义、可直接安全输出到模板的包装类型。其关键语义是Markup构造本身不做任何转义它只是把传入的字符串标记为安全。因此若把动态内容——例如用户提交的数据、f-string 插值、... .format()或%格式化后的字符串——直接交给Markup等于告诉模板引擎这段内容无需转义从而可能引入 XSS 漏洞。正确的做法有两种将最终渲染结果交给Markup的.format()方法让Markup在插值时自动执行转义例如Markup(safe {}).format(content)或使用markupsafe.escape对动态内容先做转义再包装。检测逻辑与源码级判定规则插件的检测函数通过test.checks(Call)声明只检查 AST 中的函数调用节点并使用test.test_id(B704)注册测试 ID同时以test.takes_config(markupsafe_xss)声明读取名为markupsafe_xss的配置段见 bandit/core/test_properties.py。其判定流程如下识别目标调用通过context.call_function_name_qual取得调用限定名命中markupsafe.Markup或flask.Markup后者被默认视为Markup的别名才继续否则检查是否命中extend_markup_names配置中追加的别名。参数安全性初筛若调用无参数或首个参数是常量ast.Constant如字面量字符串、字节串则判定安全直接返回None。白名单调用放行若配置了allowed_calls且首个参数是一个函数调用ast.Call其调用名经get_call_name结合 import 别名解析命中白名单则放行。其余情况判定为问题输出一条严重级别为Medium、置信度为High、CWE 编号为CWE-79XSS的告警。qualname context.call_function_name_qual if qualname not in (markupsafe.Markup, flask.Markup): if qualname not in config.get(extend_markup_names, []): return None # not a Markup call args context.node.args if not args or isinstance(args[0], ast.Constant): return None # no arguments and constant are fine allowed_calls config.get(allowed_calls, []) if (allowed_calls and isinstance(args[0], ast.Call) and get_call_name(args[0], context.import_aliases) in allowed_calls): return None # argument contains a whitelisted call return bandit.Issue( severitybandit.MEDIUM, confidencebandit.HIGH, cweissue.Cwe.XSS, textfPotential XSS with {qualname} detected. fDo not use {context.call_function_name} on untrusted data., )关键点说明get_call_name位于 bandit/core/utils.py会结合context.import_aliases把import/from-import的别名解析回真实限定名因此from bleach import clean后的clean(...)也能与配置中的bleach.clean正确匹配。由于插件注册在setup.cfg的 entry_points 中markupsafe_markup_xss bandit.plugins.markupsafe_markup_xss:markupsafe_markup_xss见 setup.cfg运行 Bandit 时该测试默认启用。配置markupsafe_xss段扩展别名与白名单B704 允许通过共享配置段markupsafe_xss自定义两类行为默认值由gen_config提供extend_markup_names与allowed_calls均默认为空列表。extend_markup_names登记更多Markup 类别名默认仅识别markupsafe.Markup与flask.Markup。若你的代码库中存在Markup的其他子类或语义相似的自定义类例如webhelpers.html.literal可通过该选项让其接受同等检测markupsafe_xss: # Recognize additional aliases extend_markup_names: - webhelpers.html.literal - my_package.Markup对应示例文件 examples/markupsafe_markup_xss_extend_markup_names.py 中Markup(funsafe {content})与literal(funsafe {content})都会被判定为 B704MEDIUM 2 条、HIGH 置信度 2 条。allowed_calls为安全的净化函数开白名单有些 HTML 净化函数如bleach.clean本身不返回markupsafe.Markup需要被Markup包裹后才能安全输出。这类先净化、再包装的写法可通过allowed_calls放行避免误报markupsafe_xss: # Allow the output of these functions to pass into Markup allowed_calls: - bleach.clean - my_package.sanitize注意官方文档明确警告——该白名单若使用不当会引入漏报false negatives因此只应登记真正具备净化/消毒语义的函数。告警输出格式与示例对不安全写法Bandit 输出类似如下告警Severity: MediumConfidence: HighCWE-79 Issue: [B704:markupsafe_markup_xss] Potential XSS with markupsafe.Markup detected. Do not use Markup on untrusted data. Severity: Medium Confidence: High CWE: CWE-79 (https://cwe.mitre.org/data/definitions/79.html) Location: ./examples/markupsafe_markup_xss.py:5:0 4 content scriptalert(Hello, world!)/script 5 Markup(funsafe {content}) 6 flask.Markup(unsafe {}.format(content))触发与放行场景全览含边界情况官方示例 examples/markupsafe_markup_xss.py 完整覆盖了各类写法代码写法结果Markup(funsafe {content})B704 触发flask.Markup(unsafe {}.format(content))B704 触发Markup(safe {}).format(content)安全Markup.format负责转义flask.Markup(bsafe {}, encodingutf-8).format(content)安全escape(content)安全显式转义Markup(content)B704 触发flask.Markup(unsafe %s % content)B704 触发Markup(objectsafe)安全无位置参数Markup(objectunsafe {}.format(content))当前版本不检测已知局限需要特别说明两个边界间接赋值不支持cleaned clean(content); Markup(cleaned)这类先赋值再传入的写法参数并非直接的ast.Call因此白名单不会放行见 examples/markupsafe_markup_xss_allowed_calls.py 中的注释indirect assignments are currently not supported。关键字参数不作为判定依据传入Markup的关键字参数object...当前不在检测范围内示例文件最后一行明确标注 Not currently detected。功能测试验证与源码一一对应Bandit 的功能测试位于 tests/functional/test_functional.py通过check_example运行 Bandit 扫描示例文件并与期望的严重度/置信度计数比对test_markupsafe_markup_xss对默认示例期望 MEDIUM 4 条、HIGH 置信度 4 条test_markupsafe_markup_xss_extend_markup_names注入b_conf.config[markupsafe_xss] {extend_markup_names: [webhelpers.html.literal]}后期望 MEDIUM 2 条、HIGH 2 条test_markupsafe_markup_xss_allowed_calls注入{allowed_calls: [bleach.clean]}后Markup(clean(content))被放行期望 MEDIUM 1 条、HIGH 1 条。三个测试分别印证了默认规则、别名扩展与白名单放行的实际行为可用于在修改配置后自行回归验证。在真实项目中的落地建议默认开启即可只要目标代码使用了markupsafe/flaskB704 就会生效无需额外启用。自定义 Markup 类时补配置若团队封装了自己的 HTML 安全包装类请在markupsafe_xss.extend_markup_names中登记保持检测覆盖。白名单务必谨慎只把真正返回净化后安全内容的函数加入allowed_calls并配合功能测试核对扫描结果。修复方式优先改用Markup(模板 {}).format(动态内容)或escape(动态内容)从根上消除 XSS 隐患。运行验证修改 bandit.yaml 后可通过bandit -c bandit.yaml -r 目标目录复扫并参考 doc/source/config.rst 中关于插件配置段section 名与插件方法名一致的说明。延伸阅读MarkupSafe 官方文档含markupsafe.Markup转义语义CWE-79Improper Neutralization of Input During Web Page Generation即 XSS本文相关源码与示例插件实现、默认示例、白名单示例、别名扩展示例、功能测试赞分享SAST应用安全【免费下载链接】banditBandit is a tool designed to find common security issues in Python code.项目地址https://gitcode.com/gh_mirrors/ba/bandit点击查看免费下载相关推荐Bandit B202tarfile_unsafe_members检测指南Python 解压路径遍历与不安全 tarfile.extractall 防护Bandit B202tarfile_unsafe_members检测指南Python 解压路径遍历与不安全 tarfile.extractall 防护SAST应用安全提升 WordPress 主题代码质量PHPCS、ESLint 与 wp-scripts 完整工作流指南提升 WordPress 主题代码质量PHPCS、ESLint 与 wp scripts 完整工作流指南 WordPress 主题 _sUnderscore后端前端Name of Person常见问题解答从安装到使用的10个实用技巧Name of Person常见问题解答从安装到使用的10个实用技巧 Name of Person是一款专为Ruby应用设计的轻量级姓名处理工具它提供了简单上一篇告别复杂积分计算SymPy积分变换轻松实现拉普拉斯与傅里叶变换下一篇AI编码优化方案提升开发效率的5步实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

视程空间Pandora边缘算力盒子实测:Orin NX 16G上跑端侧大模型的TaoToken配置与验证 2026/9/26 3:01:04

视程空间Pandora边缘算力盒子实测:Orin NX 16G上跑端侧大模型的TaoToken配置与验证

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

阅读更多 →
Optiland近轴光学 2026/9/26 3:01:04

Optiland近轴光学

文章目录光轴对象光轴方法可视化光轴对象 【Paraxial】是optiland中的光轴类,不能单独存在,必须绑定到一个具体的Optic(光学系统)上。以optiland示例的Petzval镜头为例,可直接调取其光轴成员 import matplotlib.pypl…

阅读更多 →
美赛C题获奖论文拆解:Wordle数据建模与策略优化实战 2026/9/26 3:01:04

美赛C题获奖论文拆解:Wordle数据建模与策略优化实战

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

阅读更多 →
RSI本质是动能衰减刻度,不是超买超卖标签 2026/9/26 3:00:57

RSI本质是动能衰减刻度,不是超买超卖标签

1. RSI不是“超买超卖”的万能标签&#xff0c;而是价格动能衰减的量化刻度很多人第一次接触RSI&#xff08;Relative Strength Index&#xff0c;相对强弱指数&#xff09;时&#xff0c;都会被教科书里那句“RSI > 70为超买&#xff0c;< 30为超卖”牢牢钉死。我刚入行…

阅读更多 →
拒绝付费捆绑!三款干净解压软件分享 2026/9/26 3:00:44

拒绝付费捆绑!三款干净解压软件分享

有没有很烦现在的解压工具&#xff0c;打开就要付费&#xff0c;装软件顺带装一堆乱七八糟的捆绑程序&#xff0c;体验特别差。 给大家分享三款干净无广告的解压缩软件&#xff1a;WinRAR、7‑Zip、Bandizip&#xff0c;全都没有捆绑。 重点说下 WinRAR&#xff0c;我日常主…

阅读更多 →
Codex弃用 mcp-server 后,TaoToken 统一 Key 通道怎么配进 App Server 骨架? 2026/9/26 3:00:44

Codex弃用 mcp-server 后,TaoToken 统一 Key 通道怎么配进 App Server 骨架?

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉