13
与其他可能有害的特征相比,为什么将类似eval的特征视为邪恶?
大多数现代语言(以某种方式解释)都具有某种评估功能。这样的函数执行任意语言代码,大部分时间作为字符串作为主要参数传递(不同的语言可能会向eval函数添加更多功能)。 我知道不应允许用户执行此功能(编辑,即直接或间接地从任意用户获取任意输入以传递给eval),尤其是对于服务器端软件,因为它们可能会迫使进程执行恶意代码。这样,教程和社区会告诉我们不要使用评估。但是,在很多情况下eval都是有用的和被使用的: 对软件元素的自定义访问规则(IIRC OpenERP有一个ir.rule可以使用动态python代码的对象)。 自定义计算和/或条件(OpenERP具有允许自定义代码计算的字段)。 OpenERP报表解析器(是的,我知道我对OpenERP的东西很感兴趣……但这是我的主要示例)。 在某些RPG游戏中编码法术效果。 因此,只要正确使用它们,它们就有很好的用途。主要优点是该功能允许管理员编写自定义代码,而无需创建更多文件并包含它们(尽管大多数使用eval功能的框架也可以指定要读取的文件,模块,程序包...)。 但是,在流行文化中,评估是邪恶的。就像闯入您的系统一样。 但是,如果用户以某种方式访问其他功能,这些功能可能会有害:取消链接,读取,写入(文件语义),内存分配和指针算术,数据库模型访问(即使不考虑SQL可注入的情况)。 因此,基本上,在大多数情况下,任何代码编写不正确或未正确监视(资源,用户,环境等)时,代码都是邪恶的,甚至可能导致经济影响。 但是eval函数有一些特殊之处(与语言无关)。 问题:这种恐惧成为流行文化的一部分,是否有任何历史事实,而不是同样关注其他可能危险的特征?