Tornado - 作为响应发送的JSON输出包含在字典

时间:2016-01-16 06:32:06

标签: python json http tornado httpresponse

我在文档中看到了这一部分:

  

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

所以我有几个与此相关的问题:

  1. 这是什么意思?
  2.   

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

    1. 这是什么意思?
    2.   

      请注意,由于潜在的原因,列表未转换为JSON   跨站点安全漏洞。

      1. 这是什么意思?在这里, JSON 输出是什么意思?为什么要将它包装在字典中呢?
      2.   

        所有JSON输出都应该包含在字典中。

        1. 这有两个子部分:

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

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

        2. 请尝试以编号方式回答所有部分及其子部分,以便我能够正确理解它们。

1 个答案:

答案 0 :(得分:2)

  1.   

    这是什么意思?

         
        

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

      
  2. 这意味着,如果你将dict传递给write,我们将automatically json编码。方法write可以处理dictbyteunicode_type(简化为str)。

    1.   

      这是什么意思?

           
          

      请注意,由于潜在的跨站点安全漏洞,列表未转换为JSON。

        
    2. 假设您提供了一些服务以及请求/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/

      1.   

        这是什么意思?在这里,JSON输出意味着什么?为什么要将它包装在字典中?

             
            

        所有JSON输出都应该包含在字典中。

          
      2. 如上所述,它变得非常清楚,JSON中的顶级元素不应该是array。如果你通过list,龙卷风会引发错误。当然你可以绕过这个安全,只需传递字符串(在wirte之前的json转储),但这不明智:

        self.write('["this", "is", "wrong"]')
        
        1.   

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

               

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

        2. 如果可能,我使用json或xml作为响应。但我没有使用Tornado的机制,我将已经编码的对象 - 字符串传递给write。原因是,它是覆盖Tornado编码器并使用例如编码器的最干净的方法。 ujson

          修改

          值得注意的是modern browsers should not vulnerable