2

我经常听到这样的论点(在 javascript 中,但许多语言都有类似 eval 的功能)使用 eval 是“不好的”。论点是您认为使用 eval 的大多数事情都可以通过其他方式完成,事实上 eval 在大多数情况下非常慢,并且它可以允许用户输入要执行的代码(如果没有采取适当的预防措施)。我们知道大多数功能不仅本质上是“坏的”,而是让我们关注 eval,

eval 的一些有效用途是什么?(除了为调试应用程序的开发人员提供了一个不错的功能)

4

7 回答 7

7

read-eval-print 循环通常使用 eval 来实现。

于 2009-08-26T22:24:54.990 回答
6

eval() 有好有坏。在任何支持它的语言中,eval 最糟糕的方面是它为安全漏洞敞开了大门。如果利用者能够弄清楚如何将他编写的任何自定义代码写入应用程序的 eval 语句中,那么他可能有能力做各种邪恶的事情,例如窃取私有数据或禁用应用程序提供的服务。性能是您已经表达的另一个问题。

Eval 在您的代码可能需要动态生成其他代码以轻松执行复杂任务的领域确实大放异彩。我现在想不出一个例子,但是你需要这样做的任何情况都可能不会是微不足道的。我建议仅在绝对必要时才这样做,以尽量减少我在上一段中提出的观点的风险。如果可能,永远不要相信用户输入足够安全以使用 eval 。

于 2009-08-26T22:32:50.967 回答
2

eval 的陷阱与 SQL 注入的陷阱相同。如果您在代码中动态构建字符串并调用 eval 就可以了。但是,如果您的代码盲目地将用户输入连接到要评估的字符串中,那么您就是在要求它。在许多情况下 eval 可能有用,但人们倾向于避免它,因为还有其他方法可以解决对 eval 的需求。

于 2009-08-26T22:28:48.290 回答
1

它使元编程变得轻而易举。如果您想以某种方式分析程序(即用于调试或分析目的),那就太好了。

于 2009-08-26T22:53:26.290 回答
0

从可靠来源解码 json。像在图形计算器中一样评估用户输入的表达式。想不到太多别的了,尽管它在 90 年代后期被那些不想学习访问页面元素的正确方法的人滥用了很多。

于 2009-08-26T22:29:09.413 回答
0

我曾经写过一个 perl CGI 脚本,它的输出是 perl 代码,它被另一台机器上的另一个脚本检索并 eval()'d。它只是安全的,因为我可以控制两端,但它确实解决了一个问题,否则我需要在 XML 广为人知的时代发明某种序列化格式。

于 2009-08-26T22:41:11.027 回答
0

for 的唯一合法用途是执行您无法控制的代码(除非您正在制作javascript 沙箱eval,否则您永远不应该这样做)。

于 2009-08-27T03:03:35.273 回答