如何防止虚拟主机/网站上的 PHP 写入同一 Apache 服务器上另一个虚拟主机/网站的目录?

如何防止虚拟主机/网站上的 PHP 写入同一 Apache 服务器上另一个虚拟主机/网站的目录?

我想阻止虚拟主机#1写入或读取虚拟主机#2,同时又完全不失去对 www 数据的写入权限(因为应用程序需要写入目录)。

我当前的站点配置如下:

<VirtualHost *:80>
  ServerName example.com
  ...
  DocumentRoot /var/www/example.com/public/
  ...
</VirtualHost>

<VirtualHost *:80>
  ServerName example.org
  ...
  DocumentRoot /var/www/example.org/public/
  ...
</VirtualHost>

两者都具有以下类型的权限:

drwxrws--- webmaster-com www-data example.com
drwxrws--- webmaster-org www-data example.org

我的问题是,执行的 PHP 代码/脚本example.org可以读取example.com网站的配置,其中通常包含 MySQL 密码。

答案1

使用 PHP 配置指令open_basedir

open_basedir string

将 PHP 可以访问的文件限制在指定的目录树中,包括文件本身。此指令不受安全模式是否打开的影响。

要按虚拟主机进行配置,请使用php_admin_value配置指令如下:

<VirtualHost *:80>
  ServerName example.com
  ...
  DocumentRoot /var/www/example.com/public/
  php_admin_value "open_basedir" "/var/www/example.com/"
  ...
</VirtualHost>

<VirtualHost *:80>
  ServerName example.org
  ...
  DocumentRoot /var/www/example.org/public/
  php_admin_value "open_basedir" "/var/www/example.org/"
  ...
</VirtualHost>

请务必使用php_admin_value而不是普通的,php_value因为:

php_admin_value name value

设置指定指令的值。这不能在 .htaccess 文件中使用。任何使用 php_admin_value 设置的指令类型都不能被 .htaccess 或 ini_set() 覆盖。

相关内容