【问题标题】:Django template escapingDjango模板转义
【发布时间】:2012-07-03 15:13:40
【问题描述】:

Django 模板系统提供了一些选项(过滤器)来转义 html 中的内容,但作为初学者,它们让我有些困惑。假设我正在按照教程制作一个简单的博客,并且博客内容需要转义 - 我相信内容,因为我是唯一一个编辑它的人。所以问题是我应该像 html 中的 {{ post.content|autoescape }}{{ post.content|escape }}{{ post.content|safe }} 那样做吗?

谢谢

编辑:我应该使用哪个过滤器将特殊字符自动转换为 html 实体?

编辑 2:我刚刚意识到自动转义不是有效的过滤器。

【问题讨论】:

    标签: django django-templates django-template-filters


    【解决方案1】:

    首先,您应该转义您的内容,因为您永远不知道(即使您是输入数据的人)是否需要特殊字符(如 、 )。

    您使用的语法表明您对转义的使用感到不舒服:

    这个

    {% autoescape on %}
        {{ content }}
    {% endautoescape %}
    

    和这个完全一样

    {{ content|escape }}
    

    这个

    {{ content }}
    

    与此完全相同

    {{ content|safe }} 
    

    安全就是这样使用:

    {% autoescape on %}
        {{ content }}  <-- escape
        {{ content|safe }}  <-- not escape
    {% endautoescape %}
    

    【讨论】:

    • contentcontent|safe 如果 autoescape 关闭,则将相同,这不是默认的 AFAIK。
    【解决方案2】:

    在 Django 模板中默认启用 HTML 转义。

    Autoescape 是一个标签。不是过滤器:

    {% autoescape on %}
        {{ post.content }}
    {% endautoescape %}
    

    “转义”过滤器转义字符串的 HTML。具体来说,它会进行以下替换:

    • &lt;
    • > 转换为&amp;gt;
    • '(单引号)转换为&amp;#39;
    • "(双引号)转换为&amp;quot;
    • & 转换为&amp;amp;

    “force_escape”几乎与“escape”相同,除了一些特殊情况。

    “安全”过滤器会将您的内容标记为安全,因此不会被转义(将按原样发送到浏览器)。

    我应该使用哪个过滤器将特殊字符自动转换为 html 实体?

    嗯,你的意思是,比如将Ã 转换为&amp;Atilde;?一直坚持使用 utf-8 编码,忘记这些。

    【讨论】:

    • 列出字符非常有用。这个“转义”过滤器是否适用于 HTML 元素文本和属性值?例如&lt;a title="{{ title }}"&gt;{{ text }}&lt;/a&gt;
    • @BobStein-VisiBone 我猜它无处不在,但我不确定我是否理解你的问题。有时最好发布一个新问题,因为它更有可能帮助有同样疑问的其他人。
    • @BobStein-VisiBone 在逃逸过滤器可能无法正常工作的地方位于&lt;script&gt;&lt;/script&gt; 内部,在这种情况下使用{{ value|escapejs }}
    • script/escapejs 点很有帮助。我担心 HTML 属性值(在引号之间)与 HTML 元素内容(在尖括号之外)的不同转义需求。 &amp;quot;&amp;#39; 应该包含引号。我以为我很久以前读过属性值不应该包含行终止符,但现在找不到。
    • @BobStein-VisiBone 根据我的知识,属性内的行终止符是合法的,逐字逐句。你可能读过XML attribute normalization 或类似的东西。
    【解决方案3】:

    你的问题表明你对什么是转义有点困惑。

    转义将非安全字符(如 HTML 标记)转换为 转义 版本,以便脚本标记等恶意内容不会破坏您的网站。默认情况下,Django 对模板中从变量呈现的所有内容执行此操作。

    从您的评论看来,您是唯一一个编辑您的内容的人,您想要的是呈现您的变量而不自动转义。因此,为此,您需要将其标记为安全。您可以在模板中执行此操作,方法是将整个批次包装在 {% autoescape off %}...{% endautoescape %} 标记中,或者通过 {{ myvar|safe }} 过滤单个变量。或者,您可以在视图中执行此操作,方法是在将单个变量传递给模板之前调用 mark_safe(myvar)

    【讨论】:

    • 感谢您的回答。我实际上是在尝试逃避内容,而不是将它们标记为安全。我认为安全过滤器意味着使内容安全......
    【解决方案4】:

    为避免转义,请使用“安全”(https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe):

    将字符串标记为在输出之前不需要进一步的 HTML 转义。当自动转义关闭时,此过滤器无效。

    要转义使用“转义”(https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape):

    转义字符串的 HTML。

    【讨论】:

    • 现在知道了。仍然与“安全”和“逃生”混淆。
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多