我正在编写一些 JavaScript 代码来解析用户输入的函数(用于类似电子表格的功能)。解析了公式我could将其转换为 JavaScript 并运行eval()
就可以得到结果了。
然而,我一直回避使用eval()
如果我可以避免它,因为它是邪恶的(而且,无论正确还是错误,我一直认为它在 JavaScript 中更加邪恶,因为要评估的代码可能会被用户更改)。
那么,什么时候可以使用呢?
我想花点时间来解决您问题的前提 - eval() 是“evil“。 这个单词 ”evil”,对于编程语言的人来说,通常意味着“危险”,或者更准确地说,“能够用一个看起来简单的命令造成很多伤害”。那么,什么时候可以使用危险的东西?当你知道危险是什么时是,并且当您采取适当的预防措施时。
言归正传,我们来看看使用eval()的危险性。就像其他事情一样,可能存在许多小隐患,但两大风险 - eval() 被认为是邪恶的原因 - 是性能和代码注入。
- 性能 - eval() 运行解释器/编译器。如果您的代码已编译,那么这将是一个很大的打击,因为您需要在运行时中间调用可能很重的编译器。然而,JavaScript 仍然主要是一种解释性语言,这意味着在一般情况下调用 eval() 不会对性能造成太大影响(但请参阅下面我的具体评论)。
- 代码注入 - eval() 可能会在提升的权限下运行一串代码。例如,以管理员/root 身份运行的程序永远不会想要 eval() 用户输入,因为该输入可能是“rm -rf /etc/important-file”或更糟。同样,浏览器中的 JavaScript 不存在这个问题,因为该程序无论如何都在用户自己的帐户中运行。服务器端 JavaScript 可能存在这个问题。
根据您的具体情况。据我了解,您自己生成字符串,因此假设您小心不要生成像“rm -rf Something-important”这样的字符串,则不存在代码注入风险(但请记住,这是非常非常难以确保在一般情况下这一点)。另外,我相信,如果您在浏览器中运行,那么代码注入的风险相当小。
至于性能,您必须权衡编码的便捷性。我认为,如果您正在解析公式,您最好在解析期间计算结果,而不是运行另一个解析器(eval() 内的解析器)。但使用 eval() 编码可能更容易,并且性能影响可能不会明显。在这种情况下,看起来 eval() 并不比任何其他可能节省您时间的函数更邪恶。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)