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

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

但是,如果我可以避免使用eval() ,因为它是邪恶的(而且,无论正确还是错误,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会更改由用户)。

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


我想花一点时间来解决你的问题的前提--eval()是“邪恶的”。 编程语言用户使用的“邪恶”一词通常意味着“危险”,或者更确切地说,“能够通过简单的命令导致很多伤害”。 那么,什么时候可以使用危险的东西呢? 当你知道危险是什么时,以及何时采取适当的预防措施。

关于这点,我们来看看使用eval()的危险。 和其他所有事情一样,可能存在许多小的隐患,但是两大风险--eval()被认为是邪恶的原因 - 是性能和代码注入。

  • 性能 - eval()运行解释器/编译器。 如果你的代码被编译,那么这是一个很大的打击,因为你需要在运行时调用一个可能很重的编译器。 然而,JavaScript仍然是一种解释型语言,这意味着在一般情况下调用eval()并不是很大的性能影响(但请参阅下面的具体评论)。
  • 代码注入 - eval()可能会在提升的权限下运行一串代码。 例如,以管理员/ root身份运行的程序永远不会想要eval()用户输入,因为该输入可能是“rm -rf / etc / important-file”或更糟。 同样,浏览器中的JavaScript也没有这个问题,因为程序无论如何都在用户自己的帐户中运行。 服务器端JavaScript可能会有这个问题。
  • 谈谈你的具体情况。 根据我的理解,你自己生成了字符串,所以假设你小心不要让像'rm -rf something something'这样的字符串被生成,那么就没有代码注入风险(但请记住,它非常非常在一般情况下很难确保这一点)。 另外,如果你在浏览器中运行,我相信代码注入是一个相当小的风险。

    至于性能,您必须对编码的轻松性进行权衡。 我认为如果你正在解析公式,那么你也可以在解析过程中计算结果,而不是运行另一个解析器(eval()内部的解析器)。 但使用eval()编码可能更容易,并且性能命中可能不明显。 在这种情况下,它看起来像eval()并不比任何可能为你节省一些时间的其他函数更邪恶。


    eval()不是邪恶的。 或者,如果是这样,它就像反思,文件/网络I / O,线程和IPC在其他语言中是“邪恶的”一样是邪恶的。

    如果出于您的目的, eval()比手动解释更快,或者使您的代码更简单或更清晰,那么您应该使用它。 如果没有,那么你不应该。 就那么简单。


    当你信任来源时。

    在JSON的情况下,或多或少很难篡改源,因为它来自您控制的Web服务器。 只要JSON本身不包含用户上传的数据,使用eval就没有主要缺点。

    在所有其他情况下,我会竭尽全力确保用户提供的数据符合我的规则,然后将其提供给eval()。

    链接地址: http://www.djcxy.com/p/51681.html

    上一篇: When is JavaScript's eval() not evil?

    下一篇: Expression Versus Statement