JSON.parse 与 eval()

IT技术 javascript json
2021-01-27 09:29:19

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

6个回答

如果使用eval:JSON 是 Javascript 的子集,而 json.parse 仅解析 JSON,则您更容易受到攻击eval这会为所有 JS 表达式敞开大门。

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

所有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 + ')');

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

现代浏览器提供了JSON.parse()eval()基于解析器更安全、更快的原生实现
2021-03-17 09:29:19
是的,除了之前的那一行验证它是一个安全有效的字符串。
2021-03-25 09:29:19
@plodder“优势”进行验证可能并不便宜。
2021-03-26 09:29:19
JSON.parse()在 Linux Mint 系统上的 Firefox 28 和 Chromium 33 中进行了测试它的速度是eval()Firefox 的 2 倍,是 Chromium 的 4 倍。我不确定您发布的源代码是什么,但它们在我的浏览器中并不相同。
2021-04-06 09:29:19

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

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

它不再正确,即使在它曾经正确的时候,您也应该改用适当的解析器。
2021-03-17 09:29:19

JSON.parse() 和 eval() 接受的内容有所不同。尝试评估这个:

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

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

请参阅此示例

是的。传统上,x 会用括号括起来:eval("("+x+")")。我所说的仍然成立:使用 JSON.parse() 时没有歧义。
2021-04-08 09:29:19
eval 不起作用,因为它将字符串解析为代码语句,因此将“{...}”视为代码表达式而不是值声明表达式。如果您删除歧义(例如“[{....}]”),则表达式的性质毫无疑问,并且 eval 将创建一个包含已解析对象的数组
2021-04-12 09:29:19

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

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