6

JSON.parse在现代浏览器中是否使用eval()内部来评估和执行动态代码?

因为我一直在浏览 Douglas Crockford 的 JSON 库。它也可以eval()在使用 parse() 时使用,但在实际评估之前进行预处理之后。如:-

  1. 代码中的 Unicode 字符的墙。
  2. 代码显示恶意意图。

支持 JSON.parse 的现代浏览器是本机执行此操作还是遵循其他协议?

4

2 回答 2

9

不,JSON.parse()不使用eval()

这是设计使然,因为eval()它能够执行您提供的任意 JavaScript 代码,它可以执行您不希望它执行的操作。JSON.parse()它在锡上所说的也是如此:它实际上解析了整个字符串并重建了整个对象树。

JSON.parse通常委托给使用“本机”代码实现的内部函数,其中“本机”表示在浏览器的 javascript 引擎上下文中被视为“本机”的任何内容(可以是编译的机器代码,可以是 VM 的字节码等。 .)。我认为对此没有任何强烈的要求。

实现的差异?

JSON(符号)本身由RFC4627 编码

关于JSON对象及其方法的实现,所有实现的现代浏览器都应该表现相同,因为它们应该遵循ECMAScript 5JSON 对象的相同规范。但是,总是有潜在缺陷的机会。例如,V8 最初包含这个讨厌的错误

另外,请注意,上面注释中列出的实现是为您添加JSON.parse()对本机不支持它的浏览器的支持(也称为“这些该死的旧浏览器有时需要支持”)。但这并不意味着这一定是他们实施它的方式。

例如,对于 Chrome 中使用的 Google V8 实现,请参阅 json.js ,它从json_parser.h调用本机代码。

于 2013-06-10T12:51:07.853 回答
-1

如果你仔细想想,这将是一件非常有趣的事情。

要理解为什么,看看这个类比是否有帮助:你和你的老板一起去一个你说这种语言的国家,但她不会。由于您流利,您将担任两个角色:作为她的助手(为她做任务)以及她的翻译(告诉她事情的意思)。

所以你有这两个工作,它们是互补的。你的老板可以告诉你做某事——用你们都懂的任何语言(比如英语)——也可以让你告诉她某事在说什么,比如一个标志或一份文件。她甚至可以同时做到这两点:递给你一套用另一种语言写的说明,然后说:“这是我信任的人给我的。请按照这里所说的一切去做。”

在这个类比中,向老板阅读标志或文件就像JSON.parse。你的老板给你指示并告诉你做他们所说的一切就像eval

eval如果在内部使用 JavaScript 引擎JSON.parse,那将类似于您的老板问您文档中的内容,然后您选择将文档中写入的所有内容都表演出来以向她解释。而不是仅仅阅读它。

于 2013-06-10T14:33:58.100 回答