如何在将文件包含在 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】:不要为任何类型的“安全”检查而烦恼。简而言之,您应该永远、永远 include
、require
或 eval
不可信文件的内容。
配置文件不是“有人可以将恶意代码放入其中”的东西。如果是,则应用程序设置严重损坏;这就是需要解决的问题,而不是尝试添加半生不熟的“安全”检查来解决这个明显的安全问题。
配置应仅由具有适当安全权限的人员执行。如果负责部署/配置应用程序的人是您的对手,那么担心安全性已经太迟了。
如果您想要一种“友好”的配置格式并且不担心提供此配置的第三方用户的安全隐患,请提供一种使用不可运行代码配置应用程序的方法。例如。解析文本文件、XML、ini文件等
配置仍应由受信任的应用程序用户执行,但至少他们将无法在服务器上执行任意代码(无需借助漏洞利用)。
【讨论】:
这些都是好点,感谢您的详尽回答!以上是关于如何在将文件包含在 PHP 中之前安全地评估文件的内容的主要内容,如果未能解决你的问题,请参考以下文章