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

use*_*ser 2 javascript django json django-templates django-views

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

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

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

此外,django文档escapejs:这不会使字符串在 HTML 中使用安全。您能否向我展示一个示例,说明它是如何不安全的以及我如何使其安全。

SMX*_*SMX 5

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

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

{{ my_data|json_script:"my-data" }}
Run Code Online (Sandbox Code Playgroud)

呈现为

<script id="my-data" type="application/json">
    {"hello": "world\\u003C/script\\u003E\\u0026amp;"}
</script>
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过 Javascript 访问这些数据

var value = JSON.parse(document.getElementById('my-data').textContent);
Run Code Online (Sandbox Code Playgroud)