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

Posted

技术标签:

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

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

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

    var mydata = mydata|safe ;

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

【问题讨论】:

djangosnippets.org/search/?q=json+filter 能否详细说明将使用哪些数据?文本、数字、日期、(未)解析、(未)清理等? 它是文本和数字的混合体。需要谨慎对待的是用户输入。例如。 'fruit':['apple','banana'], 'servings':'2' 【参考方案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 来对其进行转义。 )

【讨论】:

以上是关于从 django 模板中转义 JSON 数据的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

在作为 EJS 模板传递以查看的字符串化 JSON 中转义单引号

如何在 freemarker 模板处理中转义 unicode 符号?

如何在freemarker中转义json字符串

在速度模板中转义引号

如何在 JSON 中转义特殊字符

在 JSON 编码的 HTML5 数据属性中转义/编码单引号