JSON.parse与eval()

时间:2009-12-03 22:14:53

标签: javascript json

My Spider Sense警告我,使用eval()解析传入的JSON是一个坏主意。我只是想知道JSON.parse() - 我认为它是JavaScript的一部分而不是特定于浏览器的功能 - 是否更安全。

6 个答案:

答案 0 :(得分:107)

如果使用eval,则您更容易受到攻击:JSON是Javascript的子集,json.parse只解析JSON,而eval会对所有人开放JS表达式。

答案 1 :(得分:35)

所有JSON.parse实施最有可能使用eval()

JSON.parse基于Douglas Crockford's solutionline 497上使用eval()

// In the third stage we use the eval function to compile the text into a
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
// in JavaScript: it can begin a block or an object literal. We wrap the text
// in parens to eliminate the ambiguity.

j = eval('(' + text + ')');

JSON.parse的优点是它验证了参数是正确的JSON语法。

答案 2 :(得分:14)

并非所有浏览器都支持本机JSON,因此有时您需要将eval()用于JSON字符串。使用http://json.org中的JSON解析器,因为它可以更轻松地处理所有事情。

Eval()是一种邪恶,但是对某些浏览器而言它是一种必要的邪恶,但你可以避免它,这样做!!!!!

答案 3 :(得分:10)

JSON.parse()和eval()之间存在差异。试试eval:

var x =“{\”shoppingCartName \“:\”shopping_cart:2000 \“}”

eval(x)         //won't work
JSON.parse(x)   //does work

请参阅此example

答案 4 :(得分:9)

如果使用eval解析JSON,则允许解析的字符串绝对包含任何内容,因此您可能会发现自己正在执行函数调用,或者其他任何内容,而不仅仅是一组数据。

此外,JSON的parse接受一个aditional参数reviver,它允许您指定如何处理某些值,例如日期时间(内联文档here中的更多信息和示例)

答案 5 :(得分:4)

JSON只是JavaScript的一个子集。但eval评估完整的JavaScript语言,而不仅仅是JSON的子集。

相关问题