我想将django视图中的字典传递给javascript文件。字典是由站点用户填充的数据库构建的。这两种方法在安全性方面有什么区别?
var mydata = JSON.parse("{{mydata|escapejs}}");
var mydata = {{ mydata|safe }};
此外,doc at django对escapejs
说明了这一点:这不会使字符串在HTML 中安全使用。你能告诉我一个如何不安全的例子吗?我怎样才能保证安全。
答案 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>&'}
的示例数据:
{{ 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}};