Html 在脚本标记中嵌入JSON对象

Html 在脚本标记中嵌入JSON对象,html,django,json,Html,Django,Json,编辑:为了将来参考,我使用非xhtml内容类型定义 我正在使用Django创建一个网站,并试图在页面中嵌入任意json数据,供客户端javascript代码使用 假设我的json对象是{“foo”:“}。如果我直接嵌入这个 <script type='text/javascript'>JSON={"foo": "</script>"};</script> JSON={“foo”:“}; 第一个关闭json对象。(而且,它会使站点容易受到XSS攻击,因为此j

编辑:为了将来参考,我使用非xhtml内容类型定义

我正在使用Django创建一个网站,并试图在页面中嵌入任意json数据,供客户端javascript代码使用

假设我的json对象是
{“foo”:“}
。如果我直接嵌入这个

<script type='text/javascript'>JSON={"foo": "</script>"};</script>
JSON={“foo”:“};
第一个关闭json对象。(而且,它会使站点容易受到XSS攻击,因为此json对象将动态生成)

如果我使用django的HTML转义函数,结果输出为:

<script type='text/javascript'>JSON={&quot;foo&quot;: &quot;&lt;/script&gt;&quot;};</script> 
JSON={“foo”:“/script”};
并且浏览器无法解释
标记

我这里的问题是

  • 在这种情况下,我应该逃避/不逃避哪些角色
  • 在Python/django中是否有自动执行此操作的方法

  • 我试着用反斜杠避开正斜杠,这似乎奏效了:

    <script type='text/javascript'>JSON={"foo": "<\/script>"};</script>
    
    JSON={“foo”:“};
    
    你试过了吗



    另一方面,我很惊讶字符串中嵌入的
    标记破坏了javascript。起初简直不敢相信,但在Chrome和Firefox中进行了测试。

    如果您使用的是XHTML,您将能够使用实体引用(
    &;
    )来转义
    中所需的任何字符串。您不希望使用
    节,因为序列“
    ]>
    ”不能在CDATA节中表示,您必须将脚本更改为express
    ]>

    但您可能没有使用XHTML。如果您使用的是常规HTML,
    标记的行为有点像XML中的CDATA部分,只是它有更多的缺陷。它以
    结尾。还有一些神秘的规则允许
    (注释和
    开始标记必须同时存在,才能通过
    )。HTML5编辑器在未来浏览器中采用的折衷方案在和中进行了描述


    我认为需要注意的是,您必须防止JSON中出现
    ,为了安全起见,您还应该避免
    以防止注释或脚本标记失控。我认为用code\u003c/code替换
    -->

    替换
    是最简单的方法。我会这样做:

    <script type='text/javascript'>JSON={"foo": "</" + "script>"};</script>
    
    JSON={“foo”:“};
    
    对于python中的这个例子,我在bug跟踪器中打开了一个。然而,规则确实很复杂,因为
    嵌入式中断是意料之中的(我也觉得很奇怪),因为这意味着js解析必须沿着HTML解析进行(HTML解析器必须知道javascript文本的语义),这对我来说似乎非常复杂。是的,HTML解析器作为一种规则不会说javascript。脚本标记的内容只有在HTML被解析后才会传递给解释器,并且HTML不会说标记在引号之间时不是标记!是的,这是意料之中的-防止这种情况发生的常用技巧是将标记分成两部分-
    只有在使用XHTML时,才能在中使用实体引用(,)。如果您使用的是常规HTML,则无法对脚本进行HTML转义。相反,按照slebetman的建议,确保/被转义。@yonran,那么,通过运行字符串替换/to\/来转义斜杠就足够了吗?是的,应该是这样。有关浏览器如何解析脚本标记的更多信息,请参阅HTML5标记化:对不起,我错了。让我澄清一下。我要补充一点,您需要转义HTML字符,&和=以使您的json字符串能够安全地嵌入。根据谷歌的gson图书馆。