Html 在脚本标记中嵌入JSON对象
编辑:为了将来参考,我使用非xhtml内容类型定义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
我正在使用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={"foo": "</script>"};</script>
JSON={“foo”:“/script”};
并且浏览器无法解释
标记
我这里的问题是
我试着用反斜杠避开正斜杠,这似乎奏效了:
<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图书馆。