我的“蜘蛛感”告诉我使用 eval()
解析传入的 JSON 是个坏主意。我只是想知道 JSON.parse()
是否更安全,我认为它是 JavaScript 的一部分而不是特定于浏览器的函数。
我的“蜘蛛感”告诉我使用 eval()
解析传入的 JSON 是个坏主意。我只是想知道 JSON.parse()
是否更安全,我认为它是 JavaScript 的一部分而不是特定于浏览器的函数。
如果使用了eval
函数,您更容易受到攻击:JSON是Javascript的一个子集,而json.parse只解析JSON数据,然而使用eval
会让所有JS表达式都可以被执行,这就为安全漏洞留下了后门。
eval('alert(1)');
。 - Valerio Bozz所有的 JSON.parse
实现很可能都使用了 eval()
JSON.parse
基于Douglas Crockford 的解决方案,其中在第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 + ')');
< p > JSON.parse
的优点是它会验证参数的正确性,确保符合 JSON 语法。JSON.parse()
,与eval()
相比,在Firefox中快2倍,在Chromium中快4倍。我不确定您发布的源代码是什么,但在我的浏览器中它们并不相同。 - jbo5112JSON.parse()
实现,比基于eval()
的解析器更安全和更快。 - Mohammad Alhashash并非所有浏览器都具备本地 JSON 支持,因此有时需要使用 eval()
来处理 JSON 字符串。使用来自 http://json.org 的 JSON 解析器,它会更轻松地处理所有操作。
eval()
虽然有用,但在某些浏览器上它可能是一种必要的恶魔,但如果能避免使用,就应该避免!!!
JSON.parse()和eval()在接受内容方面存在差异。请尝试使用eval()来运行以下代码:
var x = "{\"shoppingCartName\":\"shopping_cart:2000\"}"
eval(x) //won't work
JSON.parse(x) //does work
请参考这个 示例。
eval
解析JSON,那么您允许被解析的字符串包含任何内容,因此它不仅仅是一组数据,而可能会执行函数调用或其他操作。parse
接受一个额外的参数reviver,它允许您指定如何处理某些值,例如日期时间(有关更多信息和示例,请参见内联文档here)。JSON只是JavaScript的一个子集。但是eval
评估的是完整的JavaScript语言,而不仅仅是JSON的子集。
JSON.parse
(直接实现在 JavaScript 引擎中)只解析 JSON。但是其他非原生实现会进行一些合理性检查,然后出于性能原因使用 eval
。 - Gumbo
JSON.parse
比eval
更快。来源。 - Paul