如何防止Python Flask模板中的XSS攻击_利用Jinja2自动转义特性

老静吖_7666

老静吖_7666

2026-05-18

161人浏览

原创

jinja2自动转义仅对{{}}变量默认生效,遇|safe、markup、富文本直出等场景即失效,需结合bleach清洗、csp、textcontent及dompurify等分层防护。

如何防止python flask模板中的xss攻击_利用jinja2自动转义特性

Jinja2 自动转义不是万能盾,但它是 Flask 里最可靠的第一道防线——前提是别主动关掉它、别绕过它、别在不该用的地方硬塞 |safe。


{{ }} 插值默认安全,但 |safe 会直接绕过

Jinja2 对 {{ variable }} 中的变量内容自动调用 html.escape(),把 <script></script> 变成 <script></script>。这层保护只作用于模板渲染阶段,且仅对双花括号生效。

  • 常见错误现象:用户提交了 <img src="x" onerror="alert(1)">,后端存进数据库没处理,前端模板里写 {{ user_comment|safe }} → 弹窗立刻触发
  • 使用场景:只有已清洗/已审核的富文本(如 CMS 后台发布的文章正文)才考虑 |safe
  • 性能影响:|safe 本身无开销,但放行未过滤 HTML 会导致 DOM 解析变慢、CSP 失效、后续无法用 textContent 回退
  • 正确替代:用 bleach.clean(user_html, tags=['p', 'br', 'strong'], strip=True) 处理后再传给模板,不加 |safe

Markup 和 html.escape() 混用极易双重编码

Markup 是 Jinja2 的可信标记类型,告诉模板“这段字符串已消毒,别再转义”。而 html.escape() 返回的是普通 str,进模板还会被再转一次。

python 查询技能
python 查询技能

查询客流数据,输出JSON格式,可直接导入Bitable等可视化工具

下载
  • 常见错误:
    from markupsafe import Markup
    from html import escape
    # 错误:先 escape 再 Markup,结果是 <script>
    Markup(escape('<script>'))
    </script>

正确:直接 Markup 已清洗内容,或用 bleach 后再 Markup

Markup(bleach.clean(raw_html))

  • 参数差异:Markup 不做任何转义,只打标签;html.escape() 默认不处理单双引号,插入属性值时需手动补全:html.escape(val, quote=True)
  • 容易踩的坑:在 flash() 消息里塞 HTML,又忘了用 Markup() 包一层 → 页面显示源码而非渲染效果

富文本直出必须后端清洗 + 前端二次防护

哪怕你用了 bleach 过滤,也不能假设前端可以放心用 innerHTML。

  • 使用场景:评论区支持 <b></b>、<a href></a> 等白名单标签
  • 实操建议:
    • 后端返回前调用 bleach.clean(html, tags=['b', 'i', 'a'], attributes={'a': ['href']}, strip=True)
    • 响应头加上 X-Content-Type-Options: nosniff 防 MIME 类型混淆
    • 前端拿到 JSON 后,绝不写 el.innerHTML = data.content;改用 DOMPurify.sanitize() 再插入,或服务端直接返回纯文本字段由前端用 textContent 渲染
  • 容易忽略的点:API 接口返回的 JSON 字段(如 { "title": "<script>..." }</script>)不会被 Jinja2 处理,jsonify() 原样下发——前端怎么接,就怎么危险

关键不在“能不能关自动转义”,而在“关了之后有没有等价的清洗链路”。绝大多数项目根本不需要关,真正该花时间的地方是:厘清数据流向、守住模板入口、约束前端插入方式。一旦出现 |safe、render_template_string()、innerHTML 这三者中的任意一个,就得立刻检查上游是否做过 bleach 或等效过滤。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1711

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4344

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25297

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3087

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3107

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2403

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程