使用JavaScript eval解析JSON

时间:2010-03-23 10:25:38

标签: javascript json eval security

问题:我正在使用eval来解析我的一个WebMethods的JSON返回值。

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

除非他们破解我的服务器,否则没有人可以修改JSOn返回值,在这种情况下,无论如何我都会遇到更大的问题。

如果他们在本地执行,JavaScript只会在他们的浏览器中执行。
所以我没有看到问题出在哪里。

使用这个具体的例子,任何人都可以对此有所了解吗?

function OnWebMethodSucceeded(JSONstrWebMethodReturnValue) 
{
    var result=eval('(' + JSONstrWebMethodReturnValue + ')')
    ... // Adding result.xy to a table
}

2 个答案:

答案 0 :(得分:14)

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

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

如果你在变量x中有这个并且做了这个:

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

...你会看到一个警报 - JavaScript运行了。安全问题。

如果您的数据来自可靠来源(听起来像是这样),我不会太担心它。也就是说,你可能对Crockford的讨论感兴趣here(Crockford是JSON的发明者和一个知识渊博的JavaScript人物)。 Crockford还在this page上提供了至少三个你可能考虑使用的公共域解析器:他的json2.js解析器和字符串化器,它在缩小时只有2.5k大小,但它仍然使用eval(它只是先采取一些预防措施);他的json_parse.js,这是一个不使用eval的递归下降解析器;和他的json_parse_state.js,状态机解析器(再次不使用eval)。所以你可以选择你的毒药。 (向Camilo Martin喊出来指出最后两个选择。)

答案 1 :(得分:4)

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(http://www.jslint.com/)测试JSON字符串中的错误。