【问题标题】:How to safely evaluate a file's contents before including it in PHP如何在将文件包含在 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;
}

【问题讨论】:

    标签: php symfony security include config


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这些都是好点,感谢您的详尽回答!
    猜你喜欢
    • 2012-10-13
    • 2013-09-19
    • 2015-06-17
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2015-01-05
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多