我在最新的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命令, 根据你的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() )。 请参阅此页面以获取文档。