编辑:为了将来参考,我使用非xhtml内容类型定义 <!html>
我正在使用Django创建一个网站,我正在尝试在我的页面中嵌入任意json数据以供客户端javascript代码使用.
让我们说我的json对象是{"foo": "</script>"}.如果我直接嵌入,
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
Run Code Online (Sandbox Code Playgroud)
第一个关闭json对象.(另外,它会使站点容易受到XSS的攻击,因为这个json对象将被动态生成).
如果我使用django的HTML转义函数,结果输出是:
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
Run Code Online (Sandbox Code Playgroud)
并且浏览器无法解释<script>标记.
我在这里的问题是,
yon*_*ran 11
如果使用的是XHTML,你将能够使用实体引用(<,>,&),以逃避你想要的任何字符串<script>.您不希望使用某个<![CDATA[...]]>部分,因为序列" ]]>"不能在CDATA部分中表达,您必须更改要表达的脚本]]>.
但你可能没有使用XHTML.如果你使用的是常规HTML,那么<script>标签的行为有点像XML中的CDATA部分,除了它有更多的陷阱.它结束于</script>.还有一些神秘的规则允许<!-- document.write("<script>...</script>") -->(注释和<script>开始标记必须同时存在</script>才能通过).对于未来的浏览器所采用的HTML5编辑器中描述的妥协HTML 5标记化和CDATA逃逸
我认为外卖是,你必须避免</script>在您的JSON发生,并且是安全的,你也应该避免<script>,<!--以及-->防止失控意见或脚本标记.我认为这是最简单的办法,以取代<与\u003c和-->与--\>
我尝试反斜杠逃避正斜杠,这似乎工作:
<script type='text/javascript'>JSON={"foo": "<\/script>"};</script>
Run Code Online (Sandbox Code Playgroud)
你试过吗?
另外,我很惊讶</script>字符串中的嵌入式标记会破坏javascript.一开始无法相信它,但在Chrome和Firefox中测试过.