4 回答
TA贡献1784条经验 获得超2个赞
我想花一点时间来解决你的问题的前提 - eval()是“ 邪恶的 ”。编程语言人使用的“ 邪恶 ” 一词通常意味着“危险”,或者更准确地说“能够通过简单的命令造成大量伤害”。那么,什么时候可以使用危险的东西呢?当您知道危险是什么时,以及何时采取适当的预防措施。
至关重点,我们来看看使用eval()的危险性。可能存在许多小的隐患,就像其他一切一样,但两个大的风险 - eval()被认为是邪恶的原因 - 是性能和代码注入。
性能 - eval()运行解释器/编译器。如果你的代码是编译的,那么这是一个很大的问题,因为你需要在运行时调用一个可能很重的编译器。但是,JavaScript仍然主要是一种解释语言,这意味着在一般情况下调用eval()并不是一个很大的性能影响(但请参阅下面的具体说明)。
代码注入 - eval()可能在提升的权限下运行一串代码。例如,以管理员/ root身份运行的程序永远不会想要eval()用户输入,因为该输入可能是“rm -rf / etc / important-file”或更糟。同样,浏览器中的JavaScript没有这个问题,因为程序无论如何都在用户自己的帐户中运行。服务器端JavaScript可能存在这个问题。
根据您的具体情况而定。根据我的理解,你自己生成字符串,所以假设你小心不要生成像“rm -rf something-important”这样的字符串,那么就没有代码注入的风险(但请记住,它非常非常在一般情况下很难确保这一点)。此外,如果你在浏览器中运行,那么代码注入是一个非常小的风险,我相信。
至于性能,你将不得不重视编码的简易性。我认为,如果你正在解析公式,你也可以在解析期间计算结果,而不是运行另一个解析器(eval()中的一个)。但是使用eval()进行编码可能更容易,并且性能损失可能不明显。看起来eval()在这种情况下并不比任何其他可以节省你一些时间的函数更邪恶。
TA贡献1796条经验 获得超7个赞
eval()
不是邪恶的。或者,如果是这样,那就像反射,文件/网络I / O,线程和IPC在其他语言中是“邪恶的”一样是邪恶的。
如果出于您的目的,eval()
比手动解释更快,或者使您的代码更简单或更清晰......那么您应该使用它。如果不是,那么你不应该。就那么简单。
TA贡献1946条经验 获得超3个赞
当你信任来源时。
在JSON的情况下,它或多或少难以篡改源,因为它来自您控制的Web服务器。只要JSON本身不包含用户上传的数据,使用eval就没有重大缺陷。
在所有其他情况下,我会竭尽全力确保用户提供的数据符合我的规则,然后再将其提供给eval()。
TA贡献1942条经验 获得超3个赞
让我们真正的人:
现在每个主要的浏览器都有一个内置的控制台,你可能会被黑客大量使用来调用任何有价值的函数 - 为什么他们会费心去使用eval语句 - 即使它们可以?
如果编译2000行JavaScript需要0.2秒,如果我评估四行JSON,我的性能会下降吗?
即使是克罗克福德对“eval is evil”的解释也很薄弱。
eval是Evil,eval函数是JavaScript最被误用的功能。躲开它
正如克罗克福德本人可能会说的那样“这种说法往往会产生非理性的神经症。不要买它。”
了解eval并了解它何时可能有用更为重要。例如,eval是评估软件生成的服务器响应的合理工具。
BTW:Prototype.js直接调用eval五次(包括evalJSON()和evalResponse())。jQuery在parseJSON中使用它(通过Function构造函数)。
添加回答
举报