2016-01-16 104 views
0

包裹予跨越這一節排在文檔:龍捲風 - 發送作爲響應JSON輸出到在字典

RequestHandler.write(chunk)

寫入給定塊到輸出緩衝器。

要將輸出寫入網絡,請使用下面的flush()方法。

如果給定的塊是字典,我們將其編寫爲JSON並將響應的Content-Type設置爲application/json。 (如果您想要 將JSON作爲不同的內容類型發送,請在調用 write()後調用set_header)。

請注意,由於潛在的 跨站點安全漏洞,列表不會轉換爲JSON。所有JSON輸出都應該在字典中包裝爲 。在 http://haacked.com/archive/2009/06/25/json-hijacking.aspx/https://github.com/facebook/tornado/issues/1009

更多細節因此,我有與此相關的幾個問題:這個

  1. 是什麼意思?

如果給定的塊是字典,我們將它寫爲JSON。

  1. 這是什麼意思?

注意列表不被轉換爲JSON,因爲潛在的 跨站點安全漏洞。

  1. 這是什麼意思?在這裏,這是什麼意思JSON輸出?爲什麼要把它包裝在字典中?

所有的JSON輸出都應該包裝在字典中。

  • 這有兩個子部件:

    一個。什麼是最好的方式發送JSON響應龍捲風客戶端

    b。什麼是更好的方式發送回覆?如果不是JSON,那麼是什麼?如果是JSON,那麼只需提及子部分(a)的答案。

  • 請儘量回答所有的部件及其編號方式的子部分,這樣我可以正確地理解他們。

    +0

    你有關於* JSON *的背景嗎? –

    回答

    1
    1. 這是什麼意思呢?

      如果給定的塊是字典,我們將它編寫爲JSON。

    這意味着,如果你通過字典來write它,我們才automatically JSON編碼。方法write可以處理dict,byte,unicode_type(簡化它是str)。

    1. 這是什麼意思?

      請注意,由於潛在的跨站點安全漏洞,列表不會轉換爲JSON。

    假設您提供一些服務,並要求/example/my_service/user_data.json和JSON響應。

    如果頂層對象會是這樣一個數組:

    ["John Smith", "[email protected]"] 
    

    然後攻擊者可以重新定義Array的構造函數,然後添加script標籤與/example/my_service/user_data.json,那將立即被評估 - 陣列與攻擊者的構造函數創建。這是因爲獨立數組有效javascript代碼。

    由於獨立的對象,但空單,是無效的JS,所以如果你回到

    {"name": "John Smith", "email":"[email protected]"} 
    

    攻擊者最終與SyntaxError: missing ; before statement或類似的東西。

    更多信息http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/

  • 這是什麼意思呢?在這裏,JSON輸出是什麼意思?爲什麼要把它包裝在字典中?

    所有的JSON輸出都應該包含在字典中。

  • 與上面的閱讀,它變得很清楚,在JSON頂級元素不應該是一個array。此外,如果您通過list,龍捲風會引發錯誤。當然,你可以繞過此安全,簡單地通過串(JSON WIRTE之前轉儲),但它不是明智:

    self.write('["this", "is", "wrong"]') 
    
  • 一個。從Tornado向客戶端發送JSON響應的最佳方式是什麼?

    b。什麼是更好的方式發送回覆?如果不是JSON,那麼是什麼?如果是JSON,那麼只需提及子部分(a)的答案。

  • 我使用,如果可能的話,JSON或XML作爲響應。但我沒有使用Tornado的機制,我將已編碼的對象字符串傳遞給write。原因是,它是覆蓋Tornado編碼器的最簡潔的方式,例如使用ujson

    編輯

    值得關注的是modern browsers should not vulnerable

    +0

    謝謝你。因此,當我使用escape.json_encode(response)然後執行self.write(response)時會發生什麼,因爲我的響應本身就是一個字典。所以現在是json編碼,那麼現在會發生什麼?哪些if語句在https://github.com/tornadoweb/tornado/blob/master/tornado/web.py#L692中能滿足? –

    +0

    當龍捲風提供其內部的json模塊時,爲什麼使用ujson(或任何其他第三方json庫)會有好處?優缺點都有什麼? –

    +0

    'json_encode'序列化objcet到JSON,它返回帶有編碼對象的字符串,所以寫入將像字符串一樣對待。 – kwarunek