为什么script标签内会自动将&转义为&?Django模板场景问题
问题根因
- Django模板默认开启HTML自动转义机制,所有模板变量输出时都会自动将
&、"、<等特殊字符转换为对应的HTML实体,你遇到的&被转为&就是Django默认转义的结果,并非浏览器层面的行为。 - 你在非
<script>标签区域看到字符串显示正常,是因为浏览器渲染普通HTML内容时,会自动把HTML实体反向解析为原始字符,你查看普通区域的页面源代码可以看到实际输出的也是&,只是渲染后不可见而已。 <script>标签内的内容浏览器会按照JavaScript语法解析,不会做HTML实体的反向解析,因此转义后的&会直接作为字符串保留,才会出现两种场景的显示差异。
解决方案
你可以通过以下方式阻止转义:
- 使用
safe过滤器,明确告知Django该变量内容无需转义:
{{ string }}<br> <script> var link = "{{ string|safe }}" </script>
- 使用专门适配JavaScript上下文的
escapejs过滤器(更推荐,可规避XSS安全风险):
<script> var link = "{{ string|escapejs }}" </script>
- 如果整块区域都不需要转义,可使用
autoescape标签关闭当前块的转义规则:
{% autoescape off %} <script> var link = "{{ string }}" </script> {% endautoescape %}
注意:如果
string变量包含用户可控制的输入内容时,不要直接使用safe过滤器,避免触发XSS注入风险,优先选择escapejs做针对性转义。
内容的提问来源于stack exchange,提问作者Programming123
相关产品推荐
相关产品推荐

