【问题标题】:What can I use instead of eval()?我可以用什么来代替 eval()?
【发布时间】: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";

标签: php eval


【解决方案1】:

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

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

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

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

【讨论】:

  • 我知道。除非我错过了什么,否则我实际上是在谈论 eval,而不是 exec
  • 再次阅读您的帖子,“call_user_func 实际上比 exec 更安全,因为...”。
  • 哦不!我不知道我会那么愚蠢,编辑。谢谢!
【解决方案2】:

我看不出你不能只使用双引号字符串构建的任何理由。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多