8

如何在 django webapp 中安全地渲染 JSON 数据?

在 django 的服务器上,我生成 JSON 数据,然后在 django 模板中呈现该 JSON 数据。JSON 有时包含 html 片段。大多数时候,这很好,但是如果</script>标签在呈现时位于 JSON 数据中,它会破坏周围的 javascript。

例如...

在服务器上,在 python 中我会有这个:

template_data = {
    'my_json' : '[{"my_snippet": "<b>Happy HTML</b>"}]'
}
# pass the template data to the django template
return render_to_response('my_template.html', template_data, context_instance = c)

然后在模板中

<script type="text/javascript">
var the_json = {{my_json|safe}};
</script>
... some html ...

生成的html工作正常,如下所示:

<script type="text/javascript">
var the_json = [{"my_snippet": "<b>Happy HTML</b>"}];
</script>
... some html ...

但是,当 JSON 在服务器上看起来像这样时,您会遇到问题:

template_data = {
    'my_json' : '[{"my_snippet": "Bad HTML</script>"}]'
}
return render_to_response('my_template.html', template_data, context_instance = c)

现在,当它被渲染时,你会得到:

<script type="text/javascript">
var the_json = [{"my_snippet": "Bad HTML</script>"}];
</script>
... some html ...

JSON 代码中的结束脚本标记被视为关闭整个脚本块。然后,您的所有 javascript 都会中断。

一种可能的解决方案是检查</script>何时将模板数据传递给模板,但我觉得有更好的方法。

4

1 回答 1

15

安全地将 JSON 作为字符串插入,然后对其调用 JSON.parse

使用escapejs而不是安全的。它是为输出到 JavaScript 而设计的。

var the_json = '{{my_json|escapejs}}';

要获取 JavaScript 对象,您需要调用JSON.parse该字符串。出于安全原因,这总是比将 JSON 编码转储到脚本中并直接评估它更可取。

将 python 对象直接发送到我使用的客户端的一个有用的过滤器是:

@register.filter
def to_js(value):
    """
    To use a python variable in JS, we call json.dumps to serialize as JSON server-side and reconstruct using
    JSON.parse. The serialized string must be escaped appropriately before dumping into the client-side code.
    """
    # separators is passed to remove whitespace in output
    return mark_safe('JSON.parse("%s")' % escapejs(json.dumps(value, separators=(',', ':'))))

并像这样使用它:

var Settings = {{ js_settings|to_js }};
于 2013-01-12T05:25:00.017 回答