【问题标题】:When should I use escape and safe in Django's template system?什么时候应该在 Django 的模板系统中使用 escape 和 safe?
【发布时间】:2010-10-30 01:40:10
【问题描述】:

如果我有一个人们放置 cmets 的盒子,然后我像这样显示该评论...我应该逃避吗?

{{ c.title }}

【问题讨论】:

    标签: python django templates escaping


    【解决方案1】:

    实际上,这取决于。 Django 的模板引擎会自动转义,所以你真的不需要转义。

    如果您添加模板过滤器“安全”,例如{{c.title|safe}},那么您确实需要担心诸如 html 注入之类的事情,因为“安全”将字符串标记为这样,这意味着它不会被转义。

    还有一个 {% autoescape on %}...{% endautoescape %} 模板标签,如果需要,可以将其中的“on”更改为“off”。默认开启,不需要标签。

    其他模板引擎可能默认不转义,Jinja2 就是其中之一。

    【讨论】:

    • 如果 Django 已经自动转义,{{ c.title }} 和 {{ c.title|escape }} 有什么区别?
    • 您可以随时控制自动转义: {% autoescape on %} {{ body }} {% endautoescape %} 这里可以使用转义过滤器选择性地转义
    • 我如何为 django 管理站点使用安全标签?
    • 你说的很清楚。我以为|safe 是为了让它安全
    【解决方案2】:

    HTML 自动转义默认是开启的,所以在大多数情况下你不需要手动转义,但不是全部

    在 HTML 元素中转储变量的内容是可以的:

    <p>{{ variable }}</p>
    

    Django 会自动转义字符&lt;&gt;&amp;"',这正是这里所需要的。

    也可以在属性中转储变量,因为 "' 都已转义,但请确保您记得包含引号,因为不会转义空格:

    <span class="{{ variable }}">...</span> <!-- Good -->
    <span class={{ variable }}>...</span>   <!-- Bad -->
    

    如果您想在内联 Javascript 中使用字符串,您必须使用 escapejs 过滤器,并且不要忘记引号。这可以防止转义 Javascript 变量的引号和使用 &lt;/script&gt; 转义 &lt;script&gt; 标记:

    <script>
       var value = "{{ variable|escapejs }}";
    </script>
    

    【讨论】:

    • 啊啊啊啊。 escapejs 是我要找的那个。我在任何地方都找不到这个
    【解决方案3】:

    是的!如果他们输入&lt;script&gt;alert('boom');&lt;/script&gt; 作为标题怎么办?

    Django 自动转义使这变得更容易。

    【讨论】:

    • 所以,我应该逃跑吗? “安全”呢?
    【解决方案4】:

    自动转义在 django 模板中默认开启,所以你不需要使用转义。当您想要关闭它并让模板渲染系统知道您的日期在未转义的形式中是安全的时,使用安全。有关详细信息,请参阅 django 文档:

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 2017-12-06
      • 2011-03-14
      • 2015-12-05
      • 2012-07-25
      • 2010-09-30
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多