代码之家  ›  专栏  ›  技术社区  ›  Stefan Steiger Marco van de Voort

使用javascript eval解析json

  •  7
  • Stefan Steiger Marco van de Voort  · 技术社区  · 16 年前

    问:我正在使用eval解析来自我的一个webmethod的json返回值。

    我不想添加jquery json,因为传输量已经很大了。 所以我用eval解析json返回值。
    现在有传言说这是不安全的。为什么?

    没有人可以修改json返回值,除非他们入侵我的服务器,在这种情况下,我会有一个更大的问题无论如何。

    如果在本地执行,javascript只在浏览器中执行。
    所以我看不出问题在哪里。

    有谁能用这个具体的例子来说明这个问题吗?

    function OnWebMethodSucceeded(JSONstrWebMethodReturnValue) 
    {
        var result=eval('(' + JSONstrWebMethodReturnValue + ')')
        ... // Adding result.xy to a table
    }
    
    2 回复  |  直到 15 年前
        1
  •  14
  •   Community Mohan Dere    8 年前

    根本问题是 eval 可以运行任何javascript,而不仅仅是反序列化json格式的数据。这是使用它处理来自不可信或半可信源的json时的风险。将json括在括号中的常见技巧不足以确保不执行任意javascript。考虑一下这个“json”,它实际上不是:

    function(){alert('Hi')})(
    

    如果你把它放在变量里 x 做了这个:

    var result = eval("(" + x + ")");
    

    ……你会看到一个警报——javascript运行了。安全问题。

    如果你的数据来自可信的来源(听起来像是),我不会太担心。也就是说,你可能对克罗克福德的讨论感兴趣 here (crockford是json的发明者,也是一个知识渊博的javascript人员)。Crockford还提供了至少三个公共域解析器 this page 您可以考虑使用:他的json2.js解析器和stringifier,当minified只有2.5k大时,它仍然使用 埃瓦 (它只是先采取了一些预防措施);他的json_parse.js是一个递归下降解析器,不使用 埃瓦 ;和他的json parse state.js,一个状态机解析器(同样不使用 埃瓦 )所以你可以选择你的毒药。 (大声喊 Camilo Martin 为了指出最后两个选择。)

        2
  •  4
  •   adamnfish    16 年前

    越来越多的json解析和编码在现代浏览器中本机可用,[ wikipedia reference ]这为您的应用程序提供了安全的json功能,而无需加载额外的库。

    您可以执行以下操作来测试本地json支持:

    var native_JSON_exists = typeof window.JSON === 'object';
    

    您应该加载一个json解析库,比如douglas crockford的库(上面由t.j.crowder链接)或者通过framewok为没有本地支持的浏览器提供的功能。(但至少应该在支持本地json的浏览器中使用它,以保护有幸拥有现代浏览器的用户)

    请记住,json是javascript语法的一个子集,因此javascript eval语句中的字符串可能无法在正确的json解析中工作。可以使用jslint测试json字符串是否有错误( http://www.jslint.com/ )