Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON.parse vs.eval()_Javascript_Json - Fatal编程技术网

Javascript JSON.parse vs.eval()

Javascript JSON.parse vs.eval(),javascript,json,Javascript,Json,我的蜘蛛感知提醒我,使用eval()解析传入的JSON是个坏主意。我只是想知道JSON.parse()(我假设它是JavaScript的一部分,而不是特定于浏览器的函数)是否更安全。JSON只是JavaScript的一个子集。但是eval评估的是完整的JavaScript语言,而不仅仅是JSON的子集。如果使用eval解析JSON,则允许解析的字符串包含绝对的任何内容,因此不只是一组数据,您可能会发现自己正在执行函数调用或其他任何操作 此外,JSON的parse接受一个传统参数reviver,它

我的蜘蛛感知提醒我,使用
eval()
解析传入的JSON是个坏主意。我只是想知道
JSON.parse()
(我假设它是JavaScript的一部分,而不是特定于浏览器的函数)是否更安全。

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

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


此外,JSON的
parse
接受一个传统参数reviver,它允许您指定如何处理某些值,例如datetime(内联文档中的更多信息和示例)如果使用
eval
,您更容易受到攻击:JSON是Javascript和JSON的一个子集。parse只解析JSON,而
eval
将为所有JS表达式敞开大门。

并非所有浏览器都有本机JSON支持,因此有时您需要使用
eval()
转换为JSON字符串。使用来自as的JSON解析器可以更轻松地处理所有事情


Eval()
是一种邪恶,但对某些浏览器来说,这是一种必要的邪恶,但在可以避免的地方,就这样做吧

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

JSON.parse
是基于的,它直接使用
eval()


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

JSON.parse()和eval()所接受的语法之间存在差异。尝试评估以下内容:

var x=“{\”shoppingCartName\:\“购物车:2000\”)


看看这个。

对,我知道。您是否暗示JSON.parse()只对JSON求值,而对所有其他传入数据求值失败?或者它只是:var myObject=eval(“(“+responseText+”);”的包装器@凯文·梅杰:是的,本机实现的
JSON.parse
(直接实现到JavaScript引擎中)只解析JSON。但是其他非本机实现使用做一些健全性检查,然后出于性能原因使用
eval
。是的,除了前面的一行验证它是安全有效的字符串之外。我在我的Linux Mint系统上的Firefox28和Chromium 33中测试了
JSON.parse()
。Firefox的速度是eval()的2倍,Chromium的4倍。我不确定您发布的源代码是什么,但它们在我的浏览器中并不相同。@plodder“advantage”进行验证可能并不便宜。提供本机的
JSON.parse()
实现,它比基于
eval()
的解析器更安全、更快。eval无法工作,因为它将字符串解析为代码语句,因此将“{…}”视为代码表达式,而不是值声明表达式。如果删除歧义(“[{..}]”,则表达式的性质毫无疑问,eval将创建一个包含已解析对象的数组。传统上,x用括号括起来:eval(“+x+”)。我所说的仍然有效:在使用JSON.parse()时没有歧义。对不起,Matheus,我不得不同意。问题是当您使用eval()解释“用户输入”时,它是JavaScript外部的任何源(包括从servlet或您调用的其他web服务返回的值)。您不能保证用户没有直接将恶意JavaScript输入到您的客户端应用程序中,或者间接地因为服务器数据库中存储的未验证数据而输入恶意JavaScript,然后通过AJAX风格的调用将其传递给您的程序。您可能仍然需要验证各个字段以避免“混淆代理”攻击,但使用JSON.parse是一个很好的第一步。@Hydro简短的概念验证:try
eval('alert(1)')
.Performance-wise,
JSON.parse
eval
更快,至少在V8(Chromium的JS引擎)中是如此。它不再是真的,即使在过去是真的时候,也应该使用适当的解析器。
// 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 + ')');
eval(x)         //won't work
JSON.parse(x)   //does work