【发布时间】:2010-08-15 20:42:32
【问题描述】:
我有一个字符串,其中存储了一些必须执行才能产生结果的变量,例如:
define('RUN_THIS', '\$something.",".$somethingElse');
然后是eval()-uated:
$foo = eval("return ".RUN_THIS.";");
我了解如果评估的字符串来自用户输入,则 eval 是不安全的。但是,例如,如果我想让所有内容都从不支持 eval() 的 Facebook 的 HipHop 中运行,我就无法做到这一点。
显然我可以使用call_user_func() - 这实际上与eval() 的结果相同吗?当eval() 不是时,如果确实如此,如何被认为是安全的?
编辑:
针对cmets,我最初并没有明确目标是什么。常量是预先定义的,以便以后的代码,无论是在可以访问配置常量的类中还是过程代码中,都可以使用它来评估给定的变量字符串。需要评估的变量可能会因情况而异(完全不同的名称、顺序、格式),但它以相同的方式为相同的目的运行,这就是为什么我目前将变量字符串设置在这个常量中的原因方法。从技术上讲,eval() 并不是不安全的,只要定义常量的 config.php 受到控制,但这不是问题的重点。
【问题讨论】:
-
如果您能首先描述一下为什么要以这种方式存储变量会很有帮助?
-
是的,这听起来有点像设计缺陷。你不能定义一个更抽象的“RUN_THIS”(不包含实际代码的),然后在代码中解析吗?
-
有你做不到的原因吗:
$foo = "\$something,$somethingElse";