[Flask][05]Jinja2模板设计文档——HTML转义

版权声明

本文出自 “ 幻冥极地 ” 博客 ,作者 小貘 采用 署名-非商业性使用-相同方式共享 协议。转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
https://www.moorehy.com/archives/216

当从模板生成 HTML 时,总是会存在一定的风险,那就是使用的变量包含了会影响 HTML 结果的字符。有两个解决办法:

a. 手动转义变量
b. 通过默认自动转义所有内容

Jinja 同时支持这两种方法。使用哪个取决于应用配置。出于各种原因,默认配置下不会自动转义:

  • 除了安全值外,转义所有变量意味着一些已知的不包含 HTML (如:数字、布尔)的值也将被 Jinja 转义,这可能是巨大的性能损失。
  • 关于变量的安全性信息是非常脆弱的。强制转义安全和不安全的值,可能会发生返回双重转义的 HTML 。

使用手动转义 (Working with Manual Escaping)

如果启动手动转义,则 有责任根据需要转义变量。转义什么?如果您有一个可能包含以下字符的变量( > , < , &"),您 应该 转义它,除非该变量包含形式合法且可信的 HTML 。转义通过传输变量到 |e 过滤器执行:

使用自动转义 (Working with Automatic Escaping)

当启动自动转义时,除了标记为安全的值外,默认转义所有内容。变量和表达式可以标记为安全,通过以下方法之一:

a. 应用上下文字典中,使用 MarkupSafe.Markup
b. 模板中,使用 |safe 过滤器

这种方法的主要问题是 Python 本身没有污染值的概念,所以无论值安全与否都可能丢失。

如果一个值没有标记为安全,自动转义将发生;这意味着您可能会得到双重转义的的内容。然而,双重转义很容易避免:只依靠 Jinja2 提供的工具,不使用 Python 的内建构造器,如 str.format 或字符串模运算符( % )。

Jinja2 函数(macros, super, self.BLOCKNAME)通常会返回标记为安全的模板数据。

因为本地 Python 字串(str, unicode, basestring)不是含 __html__ 属性的 MarkupSafe.Markup 字符串,所以模板中的字符串文字被认为是不安全的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注