【问题标题】:javascript - Why shouldn't the server respond with a JSON Array?javascript - 为什么服务器不应该使用 JSON 数组响应?
【发布时间】:2017-05-01 10:22:07
【问题描述】:

this Angular 2 guide

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

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

总是返回 JSON,外面有一个 Object
始终让外部原语成为 JSON 字符串的对象:
可利用: [{"object": "inside an array"}]
不可利用: {"object": "not inside an array"}
同样不可利用: {"result": [{"object": "inside an array"}]}

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

这是一个安全问题吗?

【问题讨论】:

    标签: javascript security


    【解决方案1】:

    为了避免JSON Hijacking

    这是一个 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 对象才能防止这种情况发生。

    【讨论】:

      【解决方案2】:

      这是一个相当糟糕的建议,已从 Angular 教程中删除。

      1. 链接的 OWASP Cheet Sheet 列出了三种防御 JSON 劫持的方法。教程选择的那个是最难正确实现的,因为必须教育每个开发人员,审核每个 REST 资源,而不是编写单个 HttpInterceptor 来将 CSRF 防御扩展到 GET 请求。
      2. JSON 劫持只会因浏览器错误而发生,这些错误往往会很快得到修复(这并不意味着此类攻击是不可能的,但简单的漏洞在现代浏览器中不再适用)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 2020-01-25
        • 1970-01-01
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多