我在文档中看到了这一部分:
RequestHandler.write(chunk)
将给定的块写入输出缓冲区。
要将输出写入网络,请使用下面的flush()方法。
如果给定的块是字典,我们将其写为JSON并设置 Content-response为application / json的响应类型。 (如果你想 将JSON作为不同的Content-Type发送,调用后调用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)的答案。
请尝试以编号方式回答所有部分及其子部分,以便我能够正确理解它们。
答案 0 :(得分:2)
这是什么意思?
如果给定的块是字典,我们将其写为JSON。
这意味着,如果你将dict传递给write
,我们将automatically 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
或类似的东西结束。
更多信息http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/
这是什么意思?在这里,JSON输出意味着什么?为什么要将它包装在字典中?
所有JSON输出都应该包含在字典中。
如上所述,它变得非常清楚,JSON中的顶级元素不应该是array
。如果你通过list
,龙卷风会引发错误。当然你可以绕过这个安全,只需传递字符串(在wirte之前的json转储),但这不明智:
self.write('["this", "is", "wrong"]')
一个。将Tornado的JSON响应发送给客户端的最佳方法是什么?
湾发送回复的更好方法是什么?如果不是JSON,那么是什么?如果它是JSON,那么只需提及子部分(a)的答案。
如果可能,我使用json或xml作为响应。但我没有使用Tornado的机制,我将已经编码的对象 - 字符串传递给write
。原因是,它是覆盖Tornado编码器并使用例如编码器的最干净的方法。 ujson
修改强>