【问题标题】:Alternatives to JavaScript eval() for parsing JSON用于解析 JSON 的 JavaScript eval() 替代方案
【发布时间】:2010-10-31 00:13:04
【问题描述】:

快速提问。 JavaScript 中的 eval 是不安全的,不是吗?我有一个 JSON 对象作为字符串,我需要将其转换为实际对象,以便获取数据:

function PopulateSeriesFields(result) 
{
    data = eval('(' + result + ')');
    var myFakeExample = data.exampleType
}

如果有帮助,我正在使用 jQuery 中的 $.ajax 方法。

谢谢

【问题讨论】:

标签: javascript jquery security json eval


【解决方案1】:

不安全?这取决于您是否可以信任这些数据。

如果您可以相信该字符串将是 JSON(并且不包含例如函数),那么它是安全的。

也就是说 - 如果您使用 jQuery,为什么要手动执行此操作?使用 dataType 选项指定它是 JSON 并让库为您处理它。

【讨论】:

  • @J-P:但前提是 JSON 不可用。 dev.jquery.com/browser/trunk/jquery/src/ajax.js#L504
  • 我有 dataType 的东西,但它仍然以字符串的形式返回。等一下,我会尝试应用程序/JSON
  • 对于那些不支持原生 JSON 的人来说,JSON 似乎只是一个插件,而不是 jQuery 的内置组件。
【解决方案2】:

使用 JavaScript 的 eval 是不安全的。因为 JSON 只是 JavaScript 的一个子集,但 JavaScript 的 eval 允许任何有效的 JavaScript。

改为使用真正的 JSON 解析器,例如 JSON parser from json.org

【讨论】:

    【解决方案3】:

    评估代码的替代方法是手动解析它。它并不像听起来那么难,但在运行时要重得多。 You can read about it here.

    需要注意的重要部分是评估 JSON 并非天生不安全。只要您相信消息来源,不要把事情搞砸。这包括确保传递到 JSON 编码器的内容被正确转义(以阻止人们在用户机器上执行代码的两个步骤)。

    【讨论】:

      【解决方案4】:

      如果您不能信任来源,那么您是对的……eval 是不安全的。它可用于将代码注入您的页面。

      查看此链接以获得更安全的选择:

      JSON in Javascript

      该页面解释了 eval 不安全的原因,并在页面底部提供了指向 JSON 解析器的链接。

      【讨论】:

        【解决方案5】:

        好吧,不管安全与否,当你使用 jQuery 时,最好使用$.getJSON() 方法,而不是 $.ajax():

        $.getJSON(url, function(data){
            alert(data.exampleType);
        });
        

        eval() 通常被认为对于 JSON 解析是安全的,当您只与自己的服务器通信时,尤其是当您在服务器端使用良好的 JSON 库以保证生成的 JSON 不会包含任何讨厌的东西时。

        即使是 JSON 的作者 Douglas Crockford 也说过,除了解析 JSON 之外,您不应该在代码中的任何地方使用 eval()。请参阅他的书中的相应部分JavaScript: The Good Parts

        【讨论】:

        • 我写的是完全一样的东西+1
        • 当然,bug getJSON() 写起来更短。
        • 除了 $.getJSON() 几乎没有提供 $.ajax() 所提供的灵活性。特别是在处理错误、成功/完成事件等方面......
        【解决方案6】:

        您应该使用JSON 并编写 JSON.parse。

        “手动”解析太慢,所以库中的 JSON.parse 实现会检查内容,然后最终使用 eval,所以它是 still unsafe。但是,如果您使用的是较新的浏览器(IE8 或 Firefox),则库代码不会实际执行。相反,本地浏览器支持会启动,然后您就安全了。

        阅读更多 herehere

        【讨论】:

        【解决方案7】:

        如果你使用 jQuery,从 1.4.1 版本开始你可以使用 jQuery.parseJSON()

        看到这个答案:Safe json parsing with jquery?

        【讨论】:

          【解决方案8】:

          你可以这样试试

          var object = new Function("return " + jsonString)()
          

          【讨论】:

          • 这只是一个 eval 别名。
          • @WillMorgan:老实说,当我第一次看到这个时,我的下巴掉了下来,因为我记得 jQuery 使用完全相同的行进行 JSON 评估。然而,在调查中,这可能不是“评估”,有关更多信息,请参阅“stackoverflow.com/questions/4599857/…”。 [顺便说一句,我编辑了答案以反映这条信息,对于“TheBrain”因为错误的原因而被否决是不公平的]
          • 这没有回答所提出的问题。该问题询问某种特定类型的代码模式是否安全。你不回答这个问题。你只是说“这里有一些你可以使用的其他代码”,这并没有回答所提出的问题。
          【解决方案9】:

          另一个不错的选择是 YUI: http://yuilibrary.com/yui/docs/json/

          所以你的代码会是这样的:

          Y.JSON.parse('{"id": 15, "name": "something"}');
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-10
            • 1970-01-01
            • 2013-05-22
            • 2012-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多