代码之家  ›  专栏  ›  技术社区  ›  bcmcfc

我可以用什么来代替eval()?

  •  5
  • bcmcfc  · 技术社区  · 14 年前

    我有一个字符串,它存储了一些必须执行才能产生结果的变量,例如:

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

    那是 eval() 衰减:

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

    我理解,如果评估的字符串来自用户输入,那么eval是不安全的。但是,例如,如果我想让所有的东西都从Facebook的hishop上运行,这不支持eval(),我就不能这样做。

    显然我可以用 call_user_func() -这个结果和 表达式() ?什么时候被认为是安全的? 表达式() 如果真是这样的话,不是吗?

    编辑: 作为对这些评论的回应,我最初并没有弄清楚目标是什么。常量是预先定义的,以便以后的代码(无论是在可以访问配置常量的类中)或过程代码可以使用它来计算给定的变量字符串。需要评估的变量可以根据情况而变化(完全不同的名称、顺序、格式),但它以相同的方式运行,这就是为什么我现在将变量字符串设置为常量的原因。技术上, 表达式() 只要定义常量的config.php受到控制,但这不是问题的关键所在,就不会不安全。

    2 回复  |  直到 13 年前
        1
  •  2
  •   Community holdenweb    7 年前

    肯德尔似乎有 a simple solution 但是我会回答你的另一个问题:

    显然,我可以使用call_user_func()-这是否与eval()的结果相同?如果eval()不是,那么如何认为它是安全的?

    call_user_func 实际上比 eval 因为事实上 调用程序 只能调用一个用户函数。 埃瓦 另一方面,执行字符串作为PHP代码本身。你可以追加 '; (关闭字符串并开始新的代码“行”)在字符串的末尾,然后再添加一些代码,添加 ;' (结束代码行并开始另一个字符串,这样就不会出现语法错误),从而允许常量 RUN_THIS 包含用户可以在服务器上运行的大量PHP代码(包括删除所有重要文件和检索数据库信息等)。 千万不要让这发生。

    调用程序 不让他发生。当你奔跑 call_user_func_array($func, $args) 用户只能运行一组受限制的函数,因为:(a)该函数必须由用户定义(b)您可以操作 $func 为了确保用户不能运行他/她想要的任何函数,也可以通过检查 $FUNC 在“允许的函数”列表中,或通过在类似 user_ 函数名和 $FUNC 变量本身(这样用户只能运行以 用户名 .

        2
  •  1
  •   Kendall Hopkins    14 年前

    我不明白为什么你不能只用双引号的字符串构建。

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