我使用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
,require
或eval
非信任文件的内容。
配置文件不是"有人可以在其中放入恶意代码"的地方。如果是,则说明应用程序设置出现了严重问题;这才是需要解决的问题,而不是试图增加不成熟的"安全"。检查这个明显的安全问题。
配置应该只有由有适当安全许可的人执行。如果负责部署/配置应用程序的人员是您的对手,那么现在再担心安全性已经太晚了。
如果你想有一个"友好的";配置格式,而不用担心第三方用户提供此配置的安全隐患,提供一种使用不可运行代码配置应用程序的方法。例如解析文本文件、XML、ini文件等
配置仍然应该由受信任的应用程序用户执行,但至少他们将无法在服务器上执行任意代码(除非诉诸漏洞利用)。