簡體   English   中英

javascript-服務器為什么不響應JSON數組?

[英]javascript - Why shouldn't the server respond with a JSON Array?

根據Angular 2指南

不要期望解碼后的JSON直接成為heroes數組。 該服務器始終將JSON結果包裝在具有data屬性的對象中。 您必須打開包裝才能獲得英雄。 這是傳統的Web API行為,受安全性問題驅動。

(“英雄”是一組對象)。
上段中的鏈接顯示

始終返回帶有外部對象的JSON
始終將外部原語作為JSON字符串的對象:
可利用的: [{"object": "inside an array"}]
不可利用: {"object": "not inside an array"}
也不能被利用: {"result": [{"object": "inside an array"}]}

我的問題是:為什么服務器不應該返回類似JSON數組的內容? 說:
[ "apples" ,"oranges" , "peaches" ]

這是如何引起安全問題的?

為了避免JSON劫持

這是JSON數組這一事實很重要。 事實證明,包含JSON數組的腳本是有效的JavaScript腳本,因此可以執行。 僅包含JSON對象的腳本不是有效的JavaScript文件。

例如,如果您有一個包含以下JSON的JavaScript文件: {“Id”:1, “Balance”:3.14}並且您有一個引用該文件的腳本標簽: <script src="http://example.com/SomeJson"></script>

您將在HTML頁面中收到JavaScript錯誤。 但是,不幸的是,如果您有一個腳本標簽引用了僅包含JSON數組的文件,則該腳本標簽將被視為有效的JavaScript,並且該數組將被執行。

因此,允許將JSON以除對象之外的任何形式返回,將可能返回包含可在客戶端級別運行的代碼的JSON數組(在客戶端不希望其可運行的情況下,可能是惡意的)等)。 僅返回JSON對象可防止這種情況的發生。

這是非常糟糕的建議,此后已從角度教程中刪除。

  1. 鏈接的OWASP Cheet Sheet列出了三種防止JSON劫持的方法。 本教程選擇的方法最難正確實施,因為必須教育每個開發人員,並審核每個REST資源,而不是編寫單個HttpInterceptor來將CSRF防御擴展到GET請求。
  2. JSON劫持只能由於瀏覽器錯誤而發生,這些錯誤通常會很快修復(這並不意味着此類攻擊是不可能的,但是簡單的漏洞利用在現代瀏覽器中不再起作用)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM