我正在为 Flask 和 SQLAlchemy 构建一个管理员,我想使用render_template
. 模板框架似乎自动转义了 HTML,因此所有<"'>
字符都转换为 HTML 实体。如何禁用它以使 HTML 正确呈现?
7 回答
要在呈现值时关闭自动转义,请使用|safe
过滤器。
{{ something|safe }}
仅对您信任的数据执行此操作,因为在不转义的情况下呈现不受信任的数据是一个跨站点脚本漏洞。
MarkupSafe提供 Jinja 的自动转义行为。您可以导入Markup
并使用它从代码中声明一个值 HTML 安全:
from markupsafe import Markup
value = Markup('<strong>The HTML String</strong>')
将其传递给模板,您不必在其上使用|safe
过滤器。
从 Jinja 文档部分HTML Escaping:
启用自动转义后,默认情况下所有内容都会被转义,但明确标记为安全的值除外。这些可以由应用程序标记,也可以使用
|safe
过滤器在模板中标记。
例子:
<div class="info">
{{data.email_content|safe}}
</div>
当您有很多不需要转义的变量时,您可以使用autoescape
覆盖块:
{% autoescape false %}
{{ something }}
{{ something_else }}
<b>{{ something_important }}</b>
{% endautoescape %}
有些人似乎关闭了自动转义,这会带来安全风险来操纵字符串显示。
如果您只想在字符串中插入一些换行符并将换行符转换为<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 ) }}
在您的模板中使用safe
过滤器,然后使用您视图中的bleach
库清理 HTML。使用漂白剂,您可以将需要使用的 HTML 标记列入白名单。
据我所知,这是最安全的。我尝试了safe
过滤器和Markup
类,两种方式都允许我执行不需要的 JavaScript。不是很安全!
为了专门处理换行符,我在最终解决之前尝试了许多选项:
{% set list1 = data.split('\n') %}
{% for item in list1 %}
{{ item }}
{% if not loop.last %}
<br/>
{% endif %}
{% endfor %}
这种方法的好处是它与自动转义兼容,让一切变得美好而安全。它还可以与过滤器结合使用,例如 urlize。
当然,它类似于 Helge 的答案,但不需要宏(而是依赖于 Jinja 的内置split
函数),也不会<br/>
在最后一项之后添加不必要的内容。