【问题标题】:Right way to escape JSON data from django template从 django 模板中转义 JSON 数据的正确方法
【发布时间】:2014-02-17 12:02:36
【问题描述】:

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

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

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

此外,doc at djangoescapejs 这么说:这不会使字符串在 HTML 中安全使用。你能给我举个例子说明它是如何不安全的吗?我怎样才能让它安全。

【问题讨论】:

  • 能否详细说明将使用哪些数据?文本、数字、日期、(未)解析、(未)清理等?
  • 它是文本和数字的混合体。需要谨慎对待的是用户输入。例如。 {'fruit':['apple','banana'], 'servings':'2'}

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


【解决方案1】:

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

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

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

呈现给

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

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

var value = JSON.parse(document.getElementById('my-data').textContent);

【讨论】:

  • 在模板标签之外也可用django.utils.html.json_script()
  • 我发了一篇文章更详细地解释了 json_script:adamj.eu/tech/2020/02/18/…
【解决方案2】:

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

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

在标签内,您可以在您的视图中json.dumps,然后使用escapejs 来保证安全。

(我相信解释的意思是,如果你想在 HTML 中显示 json.dumps 的输出,比如说在 &lt;pre&gt; 标记中,只需确保不使用 safeescapejs 来对其进行转义。 )

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 2016-01-20
    • 2013-11-03
    • 2022-11-11
    • 2013-07-27
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多