从 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>&amp;'
的示例数据:
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
的输出,比如说在 <pre>
标记中,只需确保不使用 safe
或 escapejs
来对其进行转义。 )
【讨论】:
以上是关于从 django 模板中转义 JSON 数据的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
在作为 EJS 模板传递以查看的字符串化 JSON 中转义单引号