停止PHP脚本能够读取其他虚拟主机目录中的文件

好的,假设我的Apacheconfiguration中有两个虚拟主机。 其中一个定义了example.com的目录,另一个定义了second.org。 apache的服务器根目录是/var/www/ ,两个服务器的文件根目录分别是var/www/examplevar/www/second 。 如果一个PHP脚本位于var/www/example ,它可以读取整个系统文件。 它也可以读取和执行/var/www/目录中的任何内容。 这意味着example.com上的脚本可以用于在second.org上运行或阅读脚本。

我希望能够locking每个虚拟主机,以便每个PHP脚本只能读取/ var / www / virtualdomain目录。 有点像一个共享主机服务器,如果你尝试运行一个脚本,如:

 <?php $dir = '/var/www/otheruser'; $files1 = scandir($dir); $files2 = scandir($dir, 1); print_r($files1); print_r($files2); ?> 

通常有两种处理方法:

  • 作为一个单独的用户运行你的PHP进程。
  • configurationPHP以保持其文档根目录。

两者都有其缺点。

保护PHP将允许您在启用PHP安全模式function的同时设置一个虚拟主机应该在其中运行的documet_root 。 稍微更dynamic的configuration是使用open_basedir (可以不使用安全模式),但依赖于正确的apacheconfiguration。 我不认为这些configuration是一个很好的安全function,因为它没有考虑到外部库,并且使安全性依赖于PHP实现,而不是操作系统。

作为使用Apache的独立用户运行PHP将需要第三方模块或特定的configuration。 通常PHP是作为Apache中的一个模块构build的,因此所有的PHP脚本都以与web服务器相同的用户身份运行。 像suPHP或mod_ruid这样的模块将从特定于根的用户中删除进程并继续请求。 这将需要运行Apache作为根和编译的一些模块,更不用说可能的安全漏洞。 我不会推荐这些设置。

您也可以使用mod_fastcgi或mod_proxy_fcgi切换到PHP-FPM。 这将需要您为每个想要给一个或多个虚拟主机的用户设置一个PHP-FPM“池”。 PHP-FPM将以此特定用户身份运行,并将在启动时设置为特定权限。 您也可以为每个PHP-FPM池进行特定的PHP(ini)configuration设置。

在单独的用户环境中为每个vost运行php进程,并适当地设置文件系统权限。