标题总结得很好。什么是防止执行与文件交互的函数的可靠方法?我们谈论的是 evil eval()
。
我可以完全访问即将评估的字符串。我正在考虑简单地删除后台操作符,并将文件函数名称(以及exec)替换为实际上没有任何内容的文件函数名称,但我不确定这种方法的可靠性。
示例:
PHP代码
eval("file_get_contents('passwords.ini')");
目前在执行之前将其替换为:
PHP代码
eval("fn_zero('passwords.ini')");
修改
关于 evil eval()。我在这里做的是在基于模块的内容管理系统中执行管理员创建的,数据库存储的PHP代码。编辑代码需要与主管理员登录分开的额外级别的身份验证,它不是完全不受信任的用户输入。
如果这是他/她的意图,管理员可以屠宰他/她的网站,这不是我关心的问题。我担心的是阻止查看CMS的底层PHP代码。
附录:每个站点都有自己的webroot和数据库。他们不会以这种方式互相伤害。
答案 0 :(得分:1)
回答问题,"消毒" eval输入是不可能的。简单的例子:
eval("\$f=strrev('stnetnoc_teg_elif');\$f('passwords.ini');");
执行用户提供的代码的可行选项是sandboxing或用户空间虚拟机https://github.com/ircmaxell/PHPPHP。