php 限制包含的文件访问目录树下方和上方

php 限制包含的文件访问目录树下方和上方

我几天来一直在尝试寻找解决这个问题的方法。

我有这样的结构。

  index.php
  /app
  /plugins/
  /users/%site%/functions.php 
               /other stuff

所有请求都转到 index.php,它会在 /app 中加载应用程序并在 /plugins 中加载插件。

与 wordpress 应用程序为每个站点加载 functions.php 的方式类似。

我需要限制 function.php 中的所有代码以仅访问上面的目录结构,并且我已尝试在 functions.php 加载之前使用 open_basedir 的动态 ini 设置,但问题是应用程序在 functions.php 之后开始运行,并通过挂钩中的操作从插件和核心加载所有内容(再次像在 wordpress 中一样)。

问题是由于整个应用程序是具有 Composer 依赖项的 OOP,并且插件必须与 Composer 兼容,因此 Composer 只需为类加载自动加载器,然后在 functions.php 之后,当我们在某个钩子中附加了新的 SomeClassFromPlugin 时,它实际上会尝试从自动加载器的目录中加载类。

我需要这样的结构,因为插件和核心需要有“封闭”的代码,并且用户可以以与插件类似的方式修改来自函数 php 的操作和挂钩,但 functions.php 必须是安全的,就像沙箱一样。

应用程序必须与 hhvm 兼容,并且以用户 nginx 方式运行(无多用户)

是否有真正的解决方案,或者我必须处理目录结构的模糊化,但这还不够,用户可以简单地 scandir('../..'..')

我正在运行 centos -> nginx -> hhvm (fastcgi) -> php

答案1

您能否确认您需要的是让公共用户能够访问index.php但不能直接调用任何指定子目录中的php文件?

如果是这样,答案是这里,还有另一种选择这里

例如

location ~* /plugins/.*.php$ {
    deny all;
}

location ~* /users/%site%/*.php$ {
    deny all;
}

或者简单地

location ^~ /plugins/ {
}

您可能能够在指定 %site% 的地方使用正则表达式,以便它适用于所有站点。

答案2

您需要确切地知道您想要包含的目录并将它们放在您的php.ini目录中open_basedir,顺便说一下,这允许由 PATH 分隔符分隔的多个条目(:在 Unix 上)。

您不能说我希望包含此目录来执行此操作或执行此操作。您可以将其包含或不包含。如果这构成安全隐患,则您需要检查目录结构。

无论您如何继续,所需的源代码都需要能够从其余源访问。

相关内容