一尘不染

在脚本标签中嵌入JSON对象

django

编辑:为了将来参考,我正在使用非xhtml内容类型定义 <!html>

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

假设我的json对象是{"foo": "</script>"}。如果直接将其嵌入,

<script type='text/javascript'>JSON={"foo": "</script>"};</script>

第一个关闭json对象。(此外,由于该json对象将动态生成,这将使站点容易受到XSS的攻击)。

如果我使用django的HTML转义功能,则输出为:

<script type='text/javascript'>JSON={&quot;foo&quot;: &quot;&lt;/script&gt;&quot;};</script> 

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

我在这里的问题是,

  1. 在这种情况下,我应该逃避/逃避哪些字符?
  2. 有自动的方法可以在Python / Django中执行此操作吗?

阅读 475

收藏
2020-04-03

共1个答案

一尘不染

如果使用的是XHTML,你将能够使用实体引用(&lt;,&gt;,&amp;),以逃避你想要的任何字符串<script>。你不希望使用一个<![CDATA[...]]>节,因为]]>不能在CDATA节中表示序列“ ”,并且你必须将脚本更改为express ]]>

但是你可能没有使用XHTML。如果你使用的是常规HTML,则该<script>标记的行为有点像XML中的CDATA部分,除了它有更多陷阱之外。它以结尾</script>。也有奥秘的规则允许<!-- document.write("<script>...</script>") -->(注释和<script>开始标记都必须同时存在</script>才能通过)。HTML 5标记化和CDATA Escapes描述了HTML5编辑器为将来的浏览器采用的折衷方案

我认为外卖是,你必须避免</script>在你的JSON发生,并且是安全的,你也应该避免<script><!--以及-->防止失控意见或脚本标记。我认为这是最简单的办法,以取代<与\u003c-->--\>

2020-04-03