从django模板中转义JSON数据的正确方法

时间:2014-01-26 18:29:40

标签: javascript django json django-templates django-views

我想将django视图中的字典传递给javascript文件。字典是由站点用户填充的数据库构建的。这两种方法在安全性方面有什么区别?

  1. var mydata = JSON.parse("{{mydata|escapejs}}");

  2. var mydata = {{ mydata|safe }};

  3. 此外,doc at djangoescapejs说明了这一点:这不会使字符串在HTML 中安全使用。你能告诉我一个如何不安全的例子吗?我怎样才能保证安全。

3 个答案:

答案 0 :(得分:2)

以下词典可能会在没有正确转义的情况下破坏您的页面:

{'x':'</script><b>HELLO</b>'}

在内部代码中,您可以在视图中json.dumps,然后使用escapejs保持安全。

(我相信这个解释意味着如果你想在HTML中显示json.dumps的输出,让我们说在<pre>标记中,只需确保通过不使用{{1}来转义它}或safe。)

答案 1 :(得分:2)

对于在2019年遇到此问题的任何人,Django现在都提供了|json_script模板过滤器的第三个选项。该过滤器负责正确序列化和转义Python对象以用于HTML。

docs中,使用带有不安全字符my_data = {'hello': 'world</script>&amp;'}的示例数据:

{{ my_data|json_script:"my-data" }}

推荐

<script id="my-data" type="application/json">
    {"hello": "world\\u003C/script\\u003E\\u0026amp;"}
</script>

然后您可以通过Java

访问此数据
var value = JSON.parse(document.getElementById('my-data').textContent);

答案 2 :(得分:-1)

两种方式:

您可以在python中获取json字符串,然后对其进行转义并在javascript中进行解析:

python:

context = { 'my_data': json.dumps(my_data) }

模板:

var my_data = JSON.parse('{{my_data|safe|escapejs}}');

或者,您可以使用escapejson模板过滤器https://github.com/yourcelf/escapejson

python:

context = { 'my_data': my_data }

模板:

var my_data = {{my_data|escapejson}};