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输出是什么意思? 为什么要把它包装在字典中?
  • 所有的JSON输出都应该包含在字典中。

  • 这有两个子部分:

    一个。 从Tornado客户端发送JSON响应的最佳方式是什么?

    湾 什么是更好的方式发送回复? 如果不是JSON,那么是什么? 如果是JSON,那么只需提及子部分(a)的答案。

  • 请尽量以编号方式回答所有零件及其子部分,以便我能够正确理解它们。


  • 这是什么意思?

    如果给定的块是字典,我们将其编写为JSON。

  • 这意味着,如果您通过字典来write它,我们将自动进行json编码。 write方法可以处理dictbyteunicode_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

    下一篇: $.getJSON always returns null