html - 在脚本标签中嵌入 JSON 对象

标签 html django json

编辑:为了将来引用,我正在使用非 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={&quot;foo&quot;: &quot;&lt;/script&gt;&quot;};</script> 

浏览器无法解释 <script>标签。

我的问题是,

  1. 在这种情况下我应该转义/不转义哪些角色?
  2. 是否有在 Python/django 中自动执行此操作的方法?

最佳答案

如果您使用的是 XHTML,则可以使用实体引用(&lt;&gt;&amp;)来转义 <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/

相关文章:

javascript - ajax 成功后循环 JSON 响应

html - 如何防止 p :menubar from being overlapped by the contents of a CSS template?

Django 的 I18N 与第三方应用程序

Django REST Framework - 组合和分页多个模型

python - ModelAdmin 媒体中的 Django CachedStaticFilesStorage

json - 逻辑应用 - 数据操作解析 JSON 不解析来自事件中心的内容

java - Android 向服务器发送 JSON 身份验证并检索数据

javascript - 如何删除 jQuery Accordion 的一部分?

html - page-break-inside 在 chrome 中导致未知空间

javascript - 创建内部带有按钮的div元素