一尘不染

在脚本标签中嵌入JSON对象

json

编辑:为了将来参考,我正在使用非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中执行此操作?

阅读 191

收藏
2020-07-27

共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-07-27