JavaScript中解析JSON的替代方法,不使用eval()函数

19

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

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

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

谢谢


我在这里问了一个类似的问题:https://dev59.com/EnRB5IYBdhLWcg3wXWO2 - Gad
9个回答

27

在使用jQuery时,无论安全与否,最好使用$.getJSON()方法而不是$.ajax():

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

eval()通常在与自己的服务器通信且在服务器端使用良好的JSON库保证生成的JSON不包含任何有害内容时被视为安全的JSON解析方法。

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


1
我正在写完全相同的东西+1 - Pablo Fernandez
4
没问题,bug的getJSON()写起来更短。 - Rene Saarsoo
8
除了$.getJSON()方法不如$.ajax()方法灵活,特别是在处理错误、成功/完成事件等方面,差异非常大。 - Goyuix

19

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

"手动"解析太慢了,因此库中的 JSON.parse 实现会检查一些内容,然后最终使用 eval,因此它仍然是不安全的。但是,如果你正在使用较新的浏览器(IE8或Firefox),则实际上不会执行库代码。相反,本地浏览器支持会启动,然后您就是安全的。

在这里阅读更多信息这里


http://code.google.com/p/json-sans-eval/ 是一个旨在快速且安全的手动解析器。但是,如果有原生支持的话,最好还是使用原生支持。 - Mike Samuel

6
如果您不能信任来源,那么您是正确的...eval不安全。它可以用于将代码注入到您的页面中。
请查看此链接以获得更安全的替代方案: JavaScript中的JSON 该页面解释了为什么eval不安全,并在页面底部提供了一个JSON解析器的链接。

5

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

如果您可以确信该字符串是JSON格式(例如不包含函数),那么它就是安全的。

话虽如此 - 如果您正在使用jQuery,为什么要手动处理呢?使用dataType选项指定为JSON格式,让库来为您处理。


2
@J-P:但仅当JSON不可用时。http://dev.jquery.com/browser/trunk/jquery/src/ajax.js#L504 - Gumbo
我有dataType的东西,但它仍然返回字符串。等一下,我会尝试application/JSON。 - Damien
对于那些不支持本地JSON的人来说,JSON似乎只是作为jQuery插件而不是内置组件可用。 - Gumbo

4

3

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

相反,使用来自json.org的真正的JSON解析器。


3
评估代码的替代方案是手动解析代码。听起来并不难,但运行时要重得多。重点需要注意的是,评估JSON本质上并不不安全。只要您信任源头不会弄糟事情。这包括确保传递给JSON编码器的内容已经正确转义(以防止上游2步在用户机器上执行代码)。您可以在此处阅读有关此信息的更多内容。请注意保留HTML标记。

2
你可以像这样尝试:

你可以这样尝试

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

1
这只是一个 eval 的别名。 - Will Morgan
1
@WillMorgan:说实话,当我第一次看到这个时,我的下巴都掉了,因为我想起jQuery在JSON评估方面使用了完全相同的代码。然而,在调查后,这可能不是“eval”,请参见“https://dev59.com/GG445IYBdhLWcg3w_PG3”获取更多信息。[顺便说一句,我编辑了答案以反映这一信息,对于'TheBrain'因错误原因被投票否决有点不公平] - PicoCreator
这并没有回答所问的问题。问题是询问一个特定的代码模式是否安全,而你并没有回答这个问题。你只是说“这里有一些其他的代码可以使用”,这并没有回答所问的问题。 - D.W.

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接