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

Posted

技术标签:

【中文标题】如何在将文件包含在 PHP 中之前安全地评估文件的内容【英文标题】:How to safely evaluate a file's contents before including it in PHP 【发布时间】:2021-10-09 22:05:27 【问题描述】:

我正在使用返回数组的 php 文件作为一种配置方式。 为了处理这些配置文件,我创建了一个类来搜索提供的配置目录中的 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;


【问题讨论】:

【参考方案1】:

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

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

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

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

配置仍应由受信任的应用程序用户执行,但至少他们将无法在服务器上执行任意代码(无需借助漏洞利用)。

【讨论】:

这些都是好点,感谢您的详尽回答!

以上是关于如何在将文件包含在 PHP 中之前安全地评估文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

在将新文件主动写入源目录时,如何安全地将文件导入 ssis 中的 sql server?

PHP 安全地包含文件 + 处理无效参数

PHP:如何正确检查文件的 MIME 类型?

如何在 PHP 中安全地返回文件数据

如何使用 PHP 安全地将 JSON 数据写入文件

如何将文本写入服务器端文件