我有一个字符串,用于存储必须执行以生成结果的一些变量,例如:
define('RUN_THIS', '\$something.",".$somethingElse');
然后是eval()
- uated:
$foo = eval("return ".RUN_THIS.";");
我知道如果获得评估的字符串来自用户输入,则eval是不安全的。但是,如果我想让所有东西都运行Facebook的HipHop,它不支持eval()我就不能这样做。
显然我可以使用call_user_func()
- 这与eval()
实际上是否相同?如果情况确实如此,那么当eval()
没有时,如何被认为是安全的?
修改
在回应评论时,我最初没有说明目标是什么。该常量是事先定义的,以便后面的代码,无论是在有权访问配置常量的类中,还是程序代码,都可以使用它来评估给定的变量字符串。需要评估的变量可以根据情况而变化(完全不同的名称,顺序,格式),但它以相同的方式运行相同的目的,这就是为什么我当前在此常量中设置变量字符串的原因办法。从技术上讲,eval()
并不是不安全的,只要定义常量的config.php受到控制,但这不是问题的重点。
答案 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";