### 加固 PHP 环境

PHP 作为 Apache 的模块运行时，Apache 本身的安全起主导作用，因此如果配置正确的话，PHP 应该是一个十分安全的环境，但是如果 PHP 是以 CGI 方式来运行的话，就没有这么安全了。
本文中提到的操作，对 Unix 和 Windows 都适用。
一、作为 Apache 模块来运行
因为一般说来，Apache 会以“nobody”或者“www”来运行，所以，PHP 作为模块是十分安全的。
如果 PHP 在虚拟主机环境下，可能会产生用户能浏览其他用户文件的危险。一个简单的脚本如下：
// 假定文档根位于 /usr/local/websites/mydomain
$location = '../'; // 到上一级目录
$parent = dir($location);
// 显示当前目录: /usr/local/websites
while($entry = $parent->read()) {
echo $entry . '
';
}
$parent->close();
?>
这样，只要修改$location，用户就可以浏览虚拟主机上所有其他用户的文件了。为了减少这样的危险，我们需要看一下 php.ini ，修改其中的 safe_mode, doc_root 和 usr_dir 参数，把用户限制在他自己的虚拟主机环境下：
safe_mode = On
doc_root = /usr/local/apache/htdocs
user_dir = /home/albertxu/htdocs
二、作为 CGI
把 PHP 以 CGI 方式运行需要十分小心，可能会泄露你不想让人知道的信息。
第一件事情要注意的就是一定要把执行文件放到文档根目录以外的地方。例如/usr/local/bin，因此所有的 CGI 文件开头必须带有：
#!/usr/local/bin/php
防止用户直接调用 CGI 的办法是在 Apache 中强迫 CGI 重定向：
Action php-script /cgi-bin/php.cgi
AddHandler php-script .php
这会把下面的 URL
http://example.com/mywebdir/test.htm
转换为：
http://example.com/cgi-bin/php/mywebdir/test.htm
在以 CGI 方式编译 PHP 时，最好采用下面的选项：
--enable-force-cgi-redirect