我什么时候应该在Django的模板系统中使用escape和safe?

时间:2010-10-30 01:40:11

标签: python django templates escaping

如果我有一个人们发表评论的方框,然后我会显示这样的评论......我应该逃脱吗?

{{ c.title }}

4 个答案:

答案 0 :(得分:16)

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

如果你像{{c.title|safe}}那样添加模板过滤器“safe”,那么你需要担心像html注入这样的事情,因为“safe”标记了字符串,这意味着它不会被转义。< / p>

还有{%autoescape on%} ... {%endautoescape%}模板标记,如果需要,可以将“on”更改为“off”。默认情况下它处于打开状态,不需要标记。

默认情况下,其他模板引擎可能无法转义,Jinja2就是其中之一。

答案 1 :(得分:5)

默认情况下,HTML自动转义处于启用状态,因此在大多数情况下您无需手动转义,但不是全部

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

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

Django将自动转义字符<>&"',这就是此处所需的内容。

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

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

如果要在内联Javascript中使用字符串,则必须使用escapejs过滤器,并且不要忘记引号。这可以防止从Javascript变量的引号中转出,并使用<script></script>标记中转出:

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

答案 2 :(得分:2)

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

Django autoescape让这更容易。

答案 3 :(得分:1)

django模板默认启用自动转义功能,因此您无需使用转义功能。当您想要关闭它并让模板渲染系统知道您的日期在未转义的表单中是安全的时,使用安全。有关详细信息,请参阅django文档: