JSON输出作为响应发送以包装在字典中
我在文档中遇到了这个部分:
RequestHandler.write(chunk)
将给定的块写入输出缓冲区。
要将输出写入网络,请使用下面的flush()方法。
如果给定的块是字典,我们将其编写为JSON并将响应的Content-Type设置为application / json。 (如果要将JSON作为其他Content-Type发送,请在调用write()后调用set_header)。
请注意,由于潜在的跨站点安全漏洞,列表不会转换为JSON。 所有的JSON输出都应该包含在字典中。 更多详情,请访问http://haacked.com/archive/2009/06/25/json-hijacking.aspx/和https://github.com/facebook/tornado/issues/1009
所以我有几个相关的问题:
如果给定的块是字典,我们将其编写为JSON。
请注意,由于潜在的跨站点安全漏洞,列表不会转换为JSON。
所有的JSON输出都应该包含在字典中。
这有两个子部分:
一个。 从Tornado向客户端发送JSON响应的最佳方式是什么?
湾 什么是更好的方式发送回复? 如果不是JSON,那么是什么? 如果是JSON,那么只需提及子部分(a)的答案。
请尽量以编号方式回答所有零件及其子部分,以便我能够正确理解它们。
这是什么意思?
如果给定的块是字典,我们将其编写为JSON。
这意味着,如果您通过字典来write
它,我们将自动进行json编码。 write
方法可以处理dict
, byte
, unicode_type
(简化它是str)。
这是什么意思?
请注意,由于潜在的跨站点安全漏洞,列表不会转换为JSON。
假设您提供了一些服务并请求了/example/my_service/user_data.json
和JSON响应。
如果顶级对象是一个数组,如:
["John Smith", "email@mail"]
然后攻击者可以重新定义Array的构造函数,然后添加/example/my_service/user_data.json
脚本标记,立即得到评估数组 - 使用攻击者的构造函数创建数组。 这是因为独立数组是有效的JavaScript代码。
由于独立的对象,除了空的,是无效的JS,所以如果你返回
{"name": "John Smith", "email":"email@mail"}
攻击者结束了SyntaxError: missing ; before statement
SyntaxError: missing ; before statement
或类似的东西。
更多信息http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
这是什么意思? 在这里,JSON输出是什么意思? 为什么要把它包装在字典中?
所有的JSON输出都应该包含在字典中。
正如你在上面看到的,它变得非常清楚,JSON中的顶层元素不应该是一个array
。 此外,如果您通过list
龙卷风会引发错误。当然,您可以绕过此安全性,只需传递字符串(json在垃圾之前转储),但它不明智:
self.write('["this", "is", "wrong"]')
一个。 从Tornado向客户端发送JSON响应的最佳方式是什么?
湾 什么是更好的方式发送回复? 如果不是JSON,那么是什么? 如果是JSON,那么只需提及子部分(a)的答案。
如果可能,我使用json或xml作为响应。 但我没有使用Tornado的机制,我传递了已编码的对象字符串来write
。 原因是,它是覆盖Tornado编码器并使用例如ujson的最干净的方式。
编辑
值得注意的是,现代浏览器不应该容易受到攻击。
链接地址: http://www.djcxy.com/p/47779.html上一篇: JSON Output sent as Response to be wrapped in dictionary