gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:42:57 25 4
gpt4 key购买 nike

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

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

然后 eval()-uated:

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

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

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

编辑:针对评论,我本来并没有说清楚目标是什么。常量是预先定义的,以便以后的代码(无论是在可以访问配置常量的类中还是过程代码中)可以使用它来评估给定的变量字符串。需要评估的变量可能会有所不同(完全不同的名称、顺序、格式),具体取决于情况,但它以相同的方式以相同的目的运行,这就是为什么我目前将变量字符串设置为常量方法。从技术上讲,只要定义常量的 config.php 受到控制,eval() 就不是不安全的,但这不是问题的重点。

最佳答案

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

Apparently I can use call_user_func() - is this effectively the same result as eval()? How is deemed to be secure when eval() isn't, if that is indeed the case?

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

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

关于php - 我可以用什么代替 eval()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com