PHP eval()-可靠地筛选文件函数

PHP eval()-可靠地筛选文件函数,php,eval,Php,Eval,书名对它的总结相当好。防止执行与文件交互的函数的可靠方法是什么?我们在谈论邪恶eval() 我可以完全访问将要计算的字符串。我曾考虑简单地删除backstick操作符,并将文件函数名(连同exec)替换为实际上不起任何作用的名称,但我不确定这种方法的可靠性 例如: PHP代码 eval("file_get_contents('passwords.ini')"); eval("fn_zero('passwords.ini')"); 目前,在执行之前,这将替换为: PHP代码 eval("fil

书名对它的总结相当好。防止执行与文件交互的函数的可靠方法是什么?我们在谈论邪恶
eval()

我可以完全访问将要计算的字符串。我曾考虑简单地删除backstick操作符,并将文件函数名(连同exec)替换为实际上不起任何作用的名称,但我不确定这种方法的可靠性

例如:

PHP代码

eval("file_get_contents('passwords.ini')");
eval("fn_zero('passwords.ini')");
目前,在执行之前,这将替换为:

PHP代码

eval("file_get_contents('passwords.ini')");
eval("fn_zero('passwords.ini')");

编辑

关于邪恶的评价()。我在这里所做的是在基于模块的内容管理系统中执行由管理员创建、数据库存储的PHP代码。编辑代码需要与主管理员登录分开的附加身份验证级别,它不是完全不可信的用户输入

管理员可以屠宰他/她的网站,如果这是他/她的意图,这不是我的担心。我关心的是防止查看CMS的底层PHP代码


附录:每个站点都有自己的webroot和数据库。他们不会以这种方式互相伤害。

回答问题时,“消毒”评估输入是不可能的。简单的例子:

eval("\$f=strrev('stnetnoc_teg_elif');\$f('passwords.ini');");

执行用户提供的代码的可行选项是或类似userland VM。

请记住以下引语:如果eval()是答案,那么您几乎肯定问错了问题<代码>--Rasmus Lerdorf,PHP的BDFL您能告诉我们您在功能上想要实现什么吗?因为eval()可能是个坏主意。旁注:就个人而言,我从未需要eval来修复任何问题。我的任务是为基于模块的CMS构建一个“可编程模块”。管理员可以创建自定义模块,并将其显示在自己的容器中,这些模块与库、格式化文本等预定义模块一样。我不在乎他们是否破坏了他们的网站,因为他们(应该)意识到后果。我主要要做的是阻止访问底层CMS php代码。黑名单几乎不可能100%安全,因为你几乎肯定会错过一些东西。白名单总是更好,但如果接受任意字符串到
eval()
,则几乎不可能做到这一点。一种更好的方法是定义某种微型语言,用户可以在其中选择函数的组合,并且计算结果时无需
eval()
eval()
永远都不是答案<代码>eval()是个问题。答案是“”。