编辑:为了将来参考,我正在使用非xhtml内容类型定义 <!html>
<!html>
我正在使用Django创建一个网站,并且试图在我的页面中嵌入任意json数据,以供客户端JavaScript代码使用。
假设我的json对象是{"foo": "</script>"}。如果直接将其嵌入,
{"foo": "</script>"}
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
第一个关闭json对象。(此外,由于该json对象将动态生成,这将使站点容易受到XSS的攻击)。
如果使用django的HTML转义功能,则输出为:
<script type='text/javascript'>JSON={"foo": "</script>"};</script>
并且浏览器无法解释该<script>标签。
<script>
我在这里的问题是,
如果使用的是XHTML,你将能够使用实体引用(<,>,&),以逃避你想要的任何字符串<script>。您 不 希望使用一个<![CDATA[...]]>节,因为]]>不能在CDATA节中表示序列“ ”,并且您必须将脚本更改为express ]]>。
<
>
&
<![CDATA[...]]>
]]>
但是您可能没有使用XHTML。如果您使用的是常规HTML,则该<script>标记的行为有点像XML中的CDATA部分,但它有更多的陷阱。它以结尾</script>。也有奥秘的规则允许<!-- document.write("<script>...</script>") -->(注释和<script>开始标记都必须同时存在</script>才能通过)。HTML 5标记化和CDATA Escapes描述了HTML5编辑器为将来的浏览器采用的折衷方案
</script>
<!-- document.write("<script>...</script>") -->
我认为外卖是,你必须避免</script>在您的JSON发生,并且是安全的,你也应该避免<script>,<!--以及-->防止失控意见或脚本标记。我认为这是最简单的办法,以取代<与\u003c和-->与--\>
<!--
-->
<
\u003c
--\>