gpt4 book ai didi

javascript - 在 Django 模板中安全地使用 JSON 和 JSON 中的 html

转载 作者:太空狗 更新时间:2023-10-29 13:40:25 26 4
gpt4 key购买 nike

如何在 django webapp 中安全地呈现 JSON 数据?

在 Django 的服务器上,我生成 JSON 数据,然后在 Django 模板中呈现该 JSON 数据。 JSON 偶尔包含 html 片段。大多数时候,这很好,但是如果 </script>标签在呈现时位于 JSON 数据内部,它会破坏周围的 javascript。

例如……

在服务器上,在 python 中我会这样:

template_data = {
'my_json' : '[{"my_snippet": "<b>Happy HTML</b>"}]'
}
# pass the template data to the django template
return render_to_response('my_template.html', template_data, context_instance = c)

然后在模板中:

<script type="text/javascript">
var the_json = {{my_json|safe}};
</script>
... some html ...

生成的 html 工作正常,看起来像这样:

<script type="text/javascript">
var the_json = [{"my_snippet": "<b>Happy HTML</b>"}];
</script>
... some html ...

但是,当服务器上的 JSON 如下所示时,您会遇到问题:

template_data = {
'my_json' : '[{"my_snippet": "Bad HTML</script>"}]'
}
return render_to_response('my_template.html', template_data, context_instance = c)

现在,当它被渲染时,你会得到:

<script type="text/javascript">
var the_json = [{"my_snippet": "Bad HTML</script>"}];
</script>
... some html ...

JSON 代码中的结束脚本标记被视为结束整个脚本 block 。然后,您所有的 javascript 都会中断。

一种可能的解决方案是检查 </script>将模板数据传递给模板时,但我觉得有更好的方法。

最佳答案

安全地将 JSON 作为字符串插入,然后对其调用 JSON.parse

使用escapejs而不是安全的。它专为输出到 JavaScript 而设计。

var the_json = '{{my_json|escapejs}}';

要获得 JavaScript 对象,您需要对该字符串调用 JSON.parse。出于安全原因,这总是比将 JSON 编码转储到脚本中并直接对其进行评估更可取。

将 python 对象直接获取到我使用的客户端的有用过滤器是:

@register.filter
def to_js(value):
"""
To use a python variable in JS, we call json.dumps to serialize as JSON server-side and reconstruct using
JSON.parse. The serialized string must be escaped appropriately before dumping into the client-side code.
"""
# separators is passed to remove whitespace in output
return mark_safe('JSON.parse("%s")' % escapejs(json.dumps(value, separators=(',', ':'))))

像这样使用它:

var Settings = {{ js_settings|to_js }};

关于javascript - 在 Django 模板中安全地使用 JSON 和 JSON 中的 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com