如何限制对守护程序用户的访问?

我在最新的Debian上安装了PHP 5.5.14的Apache 2.4。 根据Apache的安全提示和技巧,我已经把我的httpd.conf设置为:

<Directory /> AllowOverride none Require all denied </Directory> <Directory "/var/www"> Options FollowSymLinks AllowOverride none Require all granted </Directory> 

我重新启动Apache服务器并运行这个PHP代码:

 <?php $filename = "/etc/passwd"; $handle = fopen($filename, "r"); $contents = fread($handle, filesize($filename)); fclose($handle); echo($contents); ?> 

代码获取整个/ etc / passwd文件,我认为这是一个巨大的安全问题。 现在,我一直试图通过阅读手册来解决这个问题几天,但是我还没有运气。 我会推动正确的方向,thanx。

但是请注意, open_basedir只会限制PHP函数等的目录访问,而不能用于通过PHP执行的外部程序。 例如:

  <?php $file = shell_exec('cat /etc/passwd'); echo $file; 

会输出/etc/passwd文件的内容而不会出现问题,因为文件系统访问不是由PHP本身调用的,而是由cat程序调用的。 cat是由www-data用户默认运行的(在Debian上),所以只需要在这里使用常规的OS文件访问权限(即文件所有者,组和世界的访问权限)。

为了防止这种情况,你也可以

  • exec()passthru()system()shell_exec()这样的函数,可以通过php.ini disable_functions执行shell命令,
  • 更改文件的权限,以便运行Web服务器(或PHP)的用户无权读取文件或
  • 把Apache或PHP放入chroot监狱(虽然我从来没有尝试过)。

根据你的Apache / PHPconfiguration和你的需要, disable_functions可能是最容易设置的,但它可能会打破像ImageMagick和东西,这通常与exec() (如exec('/usr/bin/convert ...') ImageMagick)。

我testing了Debian Squeeze,使用Apache和PHP作为mod_php,而使用Apache和PHP的Ubuntu 14.04通过php-fpm运行,同样使用库中的软件包。 也许这也适用于Windows上的PHP,但我从来没有尝试过…虽然cat /etc/passwd 将无法正常工作:-)

您可以使用php.ini中定义的参数open_basedir 。 此参数将阻止PHP脚本在open_basedir指定的目录之外访问文件(如fopen()include() )。 请参阅此页面以获取文档。