我有一个字符串,存储一些必须执行以产生结果的变量,例如:
define('RUN_THIS', '\$something.",".$somethingElse');
Run Code Online (Sandbox Code Playgroud)
然后是eval()-uated:
$foo = eval("return ".RUN_THIS.";");
Run Code Online (Sandbox Code Playgroud)
我理解,如果获得评估的字符串来自用户输入,则eval是不安全的.但是,如果我想让所有东西都运行Facebook的HipHop,它不支持eval(),我就不能这样做了.
显然我可以使用call_user_func()- 这实际上是有效的结果eval()吗?eval()如果确实如此,那么如何不被认为是安全的?
编辑:
在回应评论时,我最初没有说明目标是什么.该常量是事先定义的,以便后面的代码,无论是在有权访问配置常量的类中,还是程序代码,都可以使用它来评估给定的变量字符串.需要评估的变量可以根据情况而变化(完全不同的名称,顺序,格式),但它以相同的方式运行相同的目的,这就是为什么我当前在此常量中设置变量字符串的原因办法.从技术上讲,eval()只要定义常量的config.php受到控制但这不是问题的重点,并不是不安全的.
肯德尔似乎有一个简单的解决方案,但我会尝试回答你的其他问题:
显然我可以使用 call_user_func() - 这实际上与 eval() 的结果相同吗?如果 eval() 不安全,如何被认为是安全的?
call_user_func 实际上比只能调用一个用户函数eval这一事实更安全。另一方面将字符串作为 PHP 代码本身执行。您可以在字符串末尾附加(关闭字符串并开始新的“行”代码),然后添加更多代码,添加(结束代码行并开始另一个字符串,这样就不会出现语法错误) ,从而允许常量包含用户可以在服务器上运行的大量 PHP 代码(包括删除所有重要文件和检索数据库信息等。永远不要让这种情况发生。call_user_funceval';;'RUN_THIS
call_user_func不让他的事发生。当您运行时,call_user_func_array($func, $args)用户只能运行一组有限的函数,因为:(a)该函数必须是用户定义的(b)您可以$func通过检查来操作以确保用户无法运行他/她想要的任何函数位于$func“允许的函数”列表中,或者在user_函数名称和$func变量本身前面加上类似的前缀(这样用户只能运行以user_.