我可以使用什么而不是eval()?

时间:2010-08-15 20:42:33

标签: php eval

我有一个字符串,用于存储必须执行以生成结果的一些变量,例如:

define('RUN_THIS', '\$something.",".$somethingElse');

然后是eval() - uated:

$foo = eval("return ".RUN_THIS.";");

我知道如果获得评估的字符串来自用户输入,则eval是不安全的。但是,如果我想让所有东西都运行Facebook的HipHop,它不支持eval()我就不能这样做。

显然我可以使用call_user_func() - 这与eval()实际上是否相同?如果情况确实如此,那么当eval()没有时,如何被认为是安全的?

修改 在回应评论时,我最初没有说明目标是什么。该常量是事先定义的,以便后面的代码,无论是在有权访问配置常量的类中,还是程序代码,都可以使用它来评估给定的变量字符串。需要评估的变量可以根据情况而变化(完全不同的名称,顺序,格式),但它以相同的方式运行相同的目的,这就是为什么我当前在此常量中设置变量字符串的原因办法。从技术上讲,eval()并不是不安全的,只要定义常量的config.php受到控制,但这不是问题的重点。

2 个答案:

答案 0 :(得分:2)

Kendall似乎有a simple solution,但我会尝试回答你的其他问题:

  

显然我可以使用call_user_func() - 这与eval()实际上是否相同?如果确实如此,当eval()不被认为是安全的时候?

call_user_func 实际上比eval更安全,因为call_user_func只能调用一个用户函数。另一方面,eval将字符串作为PHP代码本身执行。您可以在字符串末尾追加';(关闭字符串并开始新的“代码行”),然后再添加一些代码,添加;'(结束代码行并启动另一个字符串,以便没有语法错误),从而允许常量RUN_THIS包含用户可以在服务器上运行的许多PHP代码(包括删除所有重要文件和检索数据库的信息等。< strong>永远不要发生这种情况。

call_user_func不会让他发生。当您运行call_user_func_array($func, $args)时,用户只能运行一组受限制的功能,因为:(a)该功能必须由用户定义(b)您可以操纵$func以确保用户无法通过检查$func是否在“允许的函数”列表中,或者通过在函数名称和user_变量本身前面添加$func之类的函数来运行他/她想要的任何函数用户只能运行以user_开头的函数。

答案 1 :(得分:1)

我看不出为什么你不能只使用双引号字符串构建。

$foo = "\$something,$somethingElse";