JSON.parse与eval()

Kev*_*jor 93 javascript json

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

jld*_*ont 109

如果使用eval以下内容,您更容易受到攻击:JSON是Javascript的一个子集,json.parse只解析JSON,但eval会对所有JS表达式敞开大门.

  • 对不起,马修斯,我必须同意.问题是当您使用eval()来解释"用户输入"时 - 这是您的JavaScript外部的任何源(包括来自servlet或您调用的其他Web服务的返回值).您不能保证用户没有直接将恶意JavaScript输入您的客户端应用程序,也不能间接地因为未经验证的数据存储在服务器的数据库中,然后通过AJAX样式的调用传递给您的程序.您可能仍需要验证单个字段以避免"混淆代理"攻击,但使用JSON.parse是一个很好的第一步. (3认同)
  • @Hydro 概念的简短证明:尝试 `eval('alert(1)');`。 (2认同)

plo*_*der 37

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

JSON.parse基于Douglas Crockford的解决方案,该解决方案eval()第497行使用.

// 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 + ')');
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,除了之前的那一行验证它是一个安全有效的字符串. (55认同)
  • 我在我的Linux Mint系统上测试了Firefox 28和Chromium 33中的`JSON.parse()`.它的速度是Firefox中"eval()"的2倍,而Chromium中的速度是4倍.我不确定你发布了什么源代码,但它们在我的浏览器中并不是一回事. (5认同)
  • [现代浏览器](http://www.w3schools.com/json/json_eval.asp)提供了原生的`JSON.parse()`实现,它比基于`eval()`的解析器更安全,更快. (2认同)

Aut*_*ter 14

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

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


Jef*_*ery 11

JSON.parse()和eval()将接受的区别.试试eval:

var x ="{\"shoppingCartName \":\"shopping_cart:2000 \"}"

eval(x)         //won't work
JSON.parse(x)   //does work
Run Code Online (Sandbox Code Playgroud)

看这个例子.


Dav*_*und 9

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

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