HTML 转义

当从模板生成 HTML 时,始终有这样的风险:变量包含影响已生成 HTML 的字符。有两种解决方法:手动转义每个字符或默认自动转义所有的东西。

Jinja 两者都支持,使用哪个取决于应用的配置。默认的配置未开启自动转义有这样几个原因:

  • 转义所有非安全值的东西也意味着 Jijna 转义已知不包含 HTML 的值,比如数字,对性能有巨大影响。
  • 关于变量安全性的信息是易碎的。可能会发生强制标记一个值为安全或非安全的情况,而返回值会被作为 HTML 转义两次。

使用手动转义

如果启用了手动转义,按需转义变量就是 你的 责任。要转义什么?如果你有一个 可能 包含 ><&" 字符的变量,你必须转义它,除非变量中的 HTML 有可信的良好格式。转义通过用管道传递到过滤器 |e来实现:{{user.username|e}}

使用自动转义

当启用了自动转移,默认会转移一切,除非值被显式地标记为安全的。可以在应用中标记,也可以在模板中使用 |safe 过滤器标记。这种方法的主要问题是 Python 本身没有被污染的值的概念,所以一个值是否安全的信息会丢失。如果这个信息丢失,会继续转义,你最后会得到一个转义了两次的内容。

但双重转义很容易避免,只需要依赖 Jinja2 提供的工具而不使用诸如字符串模运算符这样的 Python 内置结构。

返回模板数据(宏、 superself.BLOCKNAME )的函数,其返回值总是被标记为安全的。

模板中的字符串字面量在自动转义中被也被视为是不安全的。这是因为安全的字符串是一个对 Python 的扩展,而不是每个库都能妥善地使用它。