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



我使用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;
}

不要为任何"安全"而烦恼。检查。简单地说,你应该永远不要include,requireeval非信任文件的内容。

配置文件不是"有人可以在其中放入恶意代码"的地方。如果是,则说明应用程序设置出现了严重问题;这才是需要解决的问题,而不是试图增加不成熟的"安全"。检查这个明显的安全问题。

配置应该只有由有适当安全许可的人执行。如果负责部署/配置应用程序的人员是您的对手,那么现在再担心安全性已经太晚了。

如果你想有一个"友好的";配置格式,而不用担心第三方用户提供此配置的安全隐患,提供一种使用不可运行代码配置应用程序的方法。例如解析文本文件、XML、ini文件等

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

最新更新