如何在将文件内容包含在 PHP 之前安全地评估文件内容

How to safely evaluate a file's contents before including it in PHP

我正在使用 PHP 文件返回数组作为一种配置方式。 为了处理这些配置文件,我创建了一个 class 以在提供的配置目录中搜索 PHP 文件,并使用 include().

将它们的值存储在配置容器中

现在我只是想知道这种方法的安全性。 如果有人将恶意代码放入这些文件之一怎么办?

在包含这些文件并可能触发不必要的副作用之前评估这些文件的最安全方法是什么?

我正在考虑使用 file_get_contents() 将文件作为字符串加载并查找任何函数调用,但我不想限制用户使用函数来解析,例如,条件配置值.

这是当前代码,仅供参考:

public function load(): void
{
    $iterator = $this->createFinder()->getIterator();

    foreach ($iterator as $file) {
        $config = include $file;

        if (! is_array($config)) {
            throw new \RuntimeException("Invalid config \"{$file->getRealPath()}\", Config files should return an array.");
        }

        $this->config[$file->getBasename()] = $config;
    }
}

private function createFinder(): Finder
{
    $this->finder = (new Finder())
        ->in($this->directories)
        ->files()
        ->name('*.php');

    return $this->finder;
}

不要为任何类型的“安全”检查而烦恼。简而言之,您应该 永远,永远 includerequireeval 不受信任文件的内容。

配置文件不是“有人可以将恶意代码放入其中”的地方。如果是,则说明应用程序设置存在严重问题;这就是需要解决的问题,而不是试图添加半生不熟的“安全”检查来解决这个明显的安全问题。

配置应由具有适当安全权限的人员执行。如果负责 deploying/configuring 应用程序的人是你的对手,那么担心安全已经太晚了。

如果您希望拥有一种“友好”的配置格式并且不担心第三方用户提供此配置的安全隐患,请提供一种使用不可运行代码配置应用程序的方法。例如。解析文本文件,XML,ini 文件等

配置仍应由受信任的应用程序用户执行,但至少他们不能在服务器上执行任意代码(不诉诸漏洞利用)。