javascript - 为什么服务器不应该用 JSON 数组响应?

Nee*_*raj 2 javascript security

根据这个 Angular 2 指南

不要期望解码后的 JSON 直接是英雄数组。此服务器始终将 JSON 结果包装在具有数据属性的对象中。你必须打开它才能得到英雄。这是由安全问题驱动的传统 Web API 行为。

('Heroes' 是一个对象数组)。 上一段中
链接说:

始终返回带有
外部对象的 JSON 始终将外部原语作为 JSON 字符串的对象:可
利用: [{"object": "inside an array"}]
不可利用: {"object": "not inside an array"}
也不可利用: {"result": [{"object": "inside an array"}]}

我的问题是:为什么服务器不应该返回类似 JSON 数组的内容?说 :
[ "apples" ,"oranges" , "peaches" ]

这是一个安全问题吗?

Yaa*_*lis 7

为避免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 对象才能防止这种情况发生。