为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

什么时候JavaScript的eval()不是邪恶的?我正在编写一些JavaScript代码来解析用户输入的函数(用于类似电子表格的功能)。解析了公式后,我可以将其转换为JavaScript并eval()在其上运行以产生结果。但是,eval()如果我可以避免它,我总是回避使用,因为它是邪恶的(而且,无论是对还是错,我一直认为它在JavaScript中更加邪恶,因为要评估的代码可能会被用户改变)。那么,什么时候可以使用它?
查看完整描述

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()在这种情况下并不比任何其他可以节省你一些时间的函数更邪恶。


查看完整回答
反对 回复 2019-05-27
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2019-05-27
?
智慧大石

TA贡献1946条经验 获得超3个赞

当你信任来源时。

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

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


查看完整回答
反对 回复 2019-05-27
?
手掌心

TA贡献1942条经验 获得超3个赞

让我们真正的人:

  1. 现在每个主要的浏览器都有一个内置的控制台,你可能会被黑客大量使用来调用任何有价值的函数 - 为什么他们会费心去使用eval语句 - 即使它们可以?

  2. 如果编译2000行JavaScript需要0.2秒,如果我评估四行JSON,我的性能会下降吗?

即使是克罗克福德对“eval is evil”的解释也很薄弱。

eval是Evil,eval函数是JavaScript最被误用的功能。躲开它

正如克罗克福德本人可能会说的那样“这种说法往往会产生非理性的神经症。不要买它。”

了解eval并了解它何时可能有用更为重要。例如,eval是评估软件生成的服务器响应的合理工具。

BTW:Prototype.js直接调用eval五次(包括evalJSON()和evalResponse())。jQuery在parseJSON中使用它(通过Function构造函数)。


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 725 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信