编辑:为了将来引用,我正在使用非 xhtml 内容类型定义 <!html>
我正在使用 Django 创建一个网站,我正在尝试在我的页面中嵌入任意 json 数据以供客户端 javascript 代码使用。
假设我的 json 对象是 {"foo": "</script>"}
.如果我直接嵌入它,
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
第一个关闭 json 对象。 (此外,它会使站点容易受到 XSS 攻击,因为此 json 对象将是动态生成的)。
如果我使用django的HTML转义函数,结果输出是:
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
浏览器无法解释 <script>
标签。
我的问题是,
- 在这种情况下我应该转义/不转义哪些角色?
- 是否有在 Python/django 中自动执行此操作的方法?
最佳答案
如果您使用的是 XHTML,则可以使用实体引用(<
、>
、&
)来转义 <script>
中您想要的任何字符串。 .您不会想要使用 <![CDATA[...]]>
节,因为序列“]]>
”无法在 CDATA 节中表达,您必须更改脚本以表达 ]]>
.
但是您可能没有使用 XHTML。如果您使用的是常规 HTML,则 <script>
标记的作用有点像 XML 中的 CDATA 部分,只是它有更多的缺陷。它以 </script>
结尾.还有神秘的规则允许<!-- document.write("<script>...</script>") -->
(注释和 <script>
开始标记必须同时存在,</script>
才能通过)。 HTML 5 tokenization 中描述了 HTML5 编辑器对 future 浏览器采取的妥协。和 CDATA Escapes
我认为要点是你必须防止 </script>
避免出现在您的 JSON 中,为了安全起见,您还应该避免 <script>
, <!--
, 和 -->
以防止失控的评论或脚本标签。我认为更换 <
最简单与 \u003c
和 -->
与 --\>
关于html - 在脚本标签中嵌入 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4176511/