226

我正在为 Flask 和 SQLAlchemy 构建一个管理员,我想使用render_template. 模板框架似乎自动转义了 HTML,因此所有<"'>字符都转换为 HTML 实体。如何禁用它以使 HTML 正确呈现?

4

7 回答 7

453

要在呈现值时关闭自动转义,请使用|safe过滤器。

{{ something|safe }}

仅对您信任的数据执行此操作,因为在不转义的情况下呈现不受信任的数据是一个跨站点脚本漏洞。

于 2010-07-08T17:48:14.937 回答
137

MarkupSafe提供 Jinja 的自动转义行为。您可以导入Markup并使用它从代码中声明一个值 HTML 安全:

from markupsafe import Markup
value = Markup('<strong>The HTML String</strong>')

将其传递给模板,您不必在其上使用|safe过滤器。

于 2010-07-16T16:00:19.423 回答
35

从 Jinja 文档部分HTML Escaping

启用自动转义后,默认情况下所有内容都会被转义,但明确标记为安全的值除外。这些可以由应用程序标记,也可以使用|safe 过滤器在模板中标记。

例子:

 <div class="info">
   {{data.email_content|safe}}
 </div>
于 2015-02-12T23:06:59.887 回答
15

当您有很多不需要转义的变量时,您可以使用autoescape覆盖块:

{% autoescape false %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
于 2019-06-28T13:16:47.407 回答
2

有些人似乎关闭了自动转义,这会带来安全风险来操纵字符串显示。

如果您只想在字符串中插入一些换行符并将换行符转换为<br />,那么您可以采用jinja 宏,例如:

{% macro linebreaks_for_string( the_string ) -%}
{% if the_string %}
{% for line in the_string.split('\n') %}
<br />
{{ line }}
{% endfor %}
{% else %}
{{ the_string }}
{% endif %}
{%- endmacro %}

在你的模板中只需调用它

{{ linebreaks_for_string( my_string_in_a_variable ) }}
于 2020-03-18T13:19:17.703 回答
1

在您的模板中使用safe过滤器,然后使用您视图中bleach库清理 HTML。使用漂白剂,您可以将需要使用的 HTML 标记列入白名单。

据我所知,这是最安全的。我尝试了safe过滤器和Markup类,两种方式都允许我执行不需要的 JavaScript。不是很安全!

于 2021-08-18T20:10:03.397 回答
0

为了专门处理换行符,我在最终解决之前尝试了许多选项:

{% set list1 = data.split('\n') %}
{% for item in list1 %}
{{ item }}
  {% if not loop.last %}
  <br/>
  {% endif %}
{% endfor %}

这种方法的好处是它与自动转义兼容,让一切变得美好而安全。它还可以与过滤器结合使用,例如 urlize。

当然,它类似于 Helge 的答案,但不需要宏(而是依赖于 Jinja 的内置split函数),也不会<br/>在最后一项之后添加不必要的内容。

于 2020-12-23T12:56:24.973 回答