【问题标题】:Is getting JSON data with jQuery safe?使用 jQuery 获取 JSON 数据安全吗?
【发布时间】:2009-02-18 02:17:13
【问题描述】:

JSON 允许您从 AJAX 调用中retrieve data in multiple formats。例如:

$.get(sourceUrl, data, callBack, 'json');

可用于从sourceUrl 获取和解析 JSON 代码。

JSON 是用于描述数据的简单 JavaScript 代码。这可以由 JavaScript 解释器评估以获取数据结构。

评估来自远程源的代码通常是个坏主意。我知道 JSON 规范并没有明确允许函数声明,但你没有理由不能在代码中包含一个函数声明,并且让一个不安全和天真的消费者编译/执行代码。

jQuery 如何处理解析?它是否评估此代码?采取了哪些保护措施来阻止某人入侵 sourceUrl 并分发恶意代码?

【问题讨论】:

    标签: javascript jquery security


    【解决方案1】:

    我最后一次查看(2008 年末)JQuery 函数 get() getJSON() 等在内部评估 JSon 字符串,因此面临与 eval 相同的安全问题。

    因此,在以任何形式使用 eval() 之前,最好使用一个解析函数来验证 JSON 字符串,以确保它不包含不可靠的非 JSON javascript 代码。

    你可以在https://github.com/douglascrockford/JSON-js/blob/master/json2.js找到这样的功能。

    请参阅JSON and Broswer Security,了解有关该领域的精彩讨论。

    总而言之,使用 JQuery 的 JSON 函数而不解析输入 JSON(使用上述链接函数或类似函数)并不是 100% 安全的。

    注意:如果 getJSON 中仍然缺少这种解析(可能是最近添加的),则更重要的是要从 JQuery 参考文档中了解由于跨域功能而导致的这种风险:

    从 jQuery 1.2 开始,您可以加载 JSON 位于另一个域的数据,如果您 指定一个 JSONP 回调,可以是 这样做:“myurl?callback=?”。 jQuery 自动替换 ? 使用正确的方法名称调用, 调用您指定的回调。

    【讨论】:

    • 我相信 oyu 现在应该使用 json.org/json2.js ——我不确定 json2 中发生的确切更新,但我知道它会避免意外覆盖本机浏览器实现JSON API(也许原来没有阻止这个?)
    • 我不明白为什么它“在使用 jQuery.getJSON() 时更重要”。两种方式都在执行 javascript 代码,并且两种方式都必须进行清理。当使用带有回调的 getJSON() 时,它通常来自另一个域,因此您无法控制 JSON 的清理。
    【解决方案2】:

    $.getJSON() 用于执行(而不是使用eval)来自远程源的 javascript 代码(如果指定了回调,则使用 JSONP 习惯用法)。使用此方法时,完全取决于您是否信任来源,因为他们将控制您的整个页面(他们甚至可以发送 cookie)。

    来自Douglas Crockford 网站关于The Script Tag Hack (jsonp):

    所以脚本可以访问和使用 它的饼干。它可以访问 使用用户的原始服务器 授权。它可以检查 DOM 和 JavaScript 全局对象,以及 发送它在任何地方找到的任何信息 在世界上。脚本标签黑客是 不安全,应该避免。

    【讨论】:

      【解决方案3】:

      IE 8Firefox 3.1 都将支持原生 JSON,这将为 eval() 提供一个安全的替代方案。我希望其他浏览器也能效仿。我还希望 jQuery 更改其实现以使用这些本地方法。

      【讨论】:

        【解决方案4】:

        我所知道的所有浏览器都通过 Ajax 禁用跨站点请求。也就是说,如果您的页面位于 my.example.com 上,则您无法使用 Ajax 加载任何内容,除非其 URL 也在 my.example.com 上。

        这实际上可能有点麻烦,攻击者可以通过其他方式注入源代码,但表面上这个限制是为了解决你提到的问题。

        【讨论】:

          猜你喜欢
          • 2018-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-09
          • 2020-12-24
          • 1970-01-01
          • 2016-07-14
          相关资源
          最近更新 更多