gpt4 book ai didi

javascript - JavaScript 的 eval() 什么时候不邪恶?

转载 作者:行者123 更新时间:2023-12-03 17:42:02 27 4
gpt4 key购买 nike

我正在编写一些 JavaScript 代码来解析用户输入的函数(用于类似电子表格的功能)。解析公式后,我可以将其转换为 JavaScript 并对其运行 eval() 以产生结果。

但是,如果我能避免的话,我总是避免使用 eval() 因为它是邪恶的(而且,无论对错,我一直认为它在 JavaScript 中更邪恶,因为要评估的代码可能会被用户更改)。

那么,什么时候可以使用呢?

最佳答案

我想花点时间来解决您问题的前提 - eval() 是“邪恶的”。 “evil”这个词被编程语言的人们使用,通常意味着“危险”,或者更准确地说“能够通过一个看似简单的命令造成很多伤害”。那么,什么时候可以使用危险的东西?当您知道危险是什么,并采取适当的预防措施时。

言归正传,让我们看看使用 eval() 的危险。就像其他一切一样,可能存在许多小隐患,但两大风险 - eval() 被认为是邪恶的原因 - 是性能和代码注入(inject)。

  • 性能 - eval() 运行解释器/编译器。如果您的代码已编译,那么这是一个很大的打击,因为您需要在运行时调用一个可能很繁重的编译器。然而,JavaScript 仍然主要是一种解释型语言,这意味着在一般情况下调用 eval() 不会对性能造成很大影响(但请参阅下面我的具体评论)。
  • 代码注入(inject) - eval() 可能会在提升的权限下运行一串代码。例如,以管理员/root 身份运行的程序永远不会想要 eval() 用户输入,因为该输入可能是“rm -rf/etc/important-file”或更糟。同样,浏览器中的 JavaScript 没有这个问题,因为该程序无论如何都是在用户自己的帐户中运行的。服务器端 JavaScript 可能有这个问题。

根据您的具体情况。据我了解,您是自己生成字符串,因此假设您小心翼翼地不允许生成像“rm -rf something-important”这样的字符串,则没有代码注入(inject)风险(但请记住,它是 在一般情况下很难确保这一点)。此外,如果您在浏览器中运行,那么代码注入(inject)的风险很小,我相信。

至于性能,您必须权衡编码的难易程度。我认为,如果您要解析公式,您最好在解析期间计算结果,而不是运行另一个解析器(eval() 中的解析器)。但是使用 eval() 编写代码可能更容易,而且性能损失可能不会很明显。看起来 eval() 在这种情况下并不比任何其他可能为您节省一些时间的函数更邪恶。

关于javascript - JavaScript 的 eval() 什么时候不邪恶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21885169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com