2010-03-23 89 views
7

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

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

没有人可以修改JSOn的返回值,除非他们破解我的服务器,在这种情况下,我会有一个更大的问题。

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

有没有人可以通过这个具体的例子揭示这一点?使用JavaScript eval解析JSON

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

回答

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您指出那些过去两年的替代品。)

+4

应该注意的是,Crockford的JSON包含两个其他库(除了主json.js和json2.js)以及不使用'eval'的不同解析模式。他们是'json_parse.js'和'json_parse_state.js',可以在这里找到(https://github.com/douglascrockford/JSON-js/) – 2010-12-08 06:48:43

+0

@Camilo:非常好,谢谢! – 2010-12-08 10:02:32

+0

可以说,我没有来自外部来源的输入,我可以安全地使用eval吗? – 2013-02-08 19:57:22

4

越来越多的JSON解析和编码可用本机在现代浏览器,[wikipedia reference]这使你的应用程序安全的JSON功能,无需加载额外的库。

你可以做这样的事情测试原生JSON支持:通过framewok可用

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

您应该加载像道格拉斯Crockford的一个JSON解析库(由TJ克罗德链接,以上)或功能对于没有本地支持的浏览器。 (但您至少应该在支持它的浏览器中使用本机JSON,以保护足够幸运拥有现代浏览器的用户)

请记住,JSON是JavaScript语法的一个子集,因此可用于JavaScript eval语句的字符串可能不适用于正确的JSON解析。您可以使用JSLint测试您的JSON字符串的错误(http://www.jslint.com/)。

+1

+1不幸的是,本地支持还没有真正准备好黄金时间, (令人惊讶的)太多的执行错误。但它会到达那里。 – 2010-03-23 16:43:35

+0

@ T.J。克劳德什么错误? – 2010-12-08 04:29:01

+0

@Camilo:这里有[this one](http://stackoverflow.com/questions/1288962/ie8-native-json-parse-bug-causes-stack-overflow)。我确定我听说过Prototype和jQuery库中有关其他人(而不仅仅是IE)的评论。在近期内,我想我可能会坚持使用json2.js或(如果我正在解析来自不可信或半可信来源的数据)您指定的非eval json_parse.js和json_parse_state.js备选方案Crockford的[github页面](https://github.com/douglascrockford/JSON-js/)。 – 2010-12-08 10:04:32