# grep PHP_INI_ /PHP_SRC/main/main.c
在讨论 PHP 安全配置之前,应该好好了解 PHP 的 safe_mode 模式。
1 、 safe_mode
safe_mode 是唯一 PHP_INI_SYSTEM 属性,必须通过 php.ini 或 httpd.conf 来设置。要启 用
safe_mode ,只需修改 php.ini :
safe_mode = On
或者修改 httpd.conf ,定义目录:
<Directory /var/www>
Options FollowSymLinks
php_admin_value safe_mode 1
</Directory>
重启 apache 后 safe_mode 就生效了 。 启动 safe_mode , 会对许多 PHP 函数进行限制 , 特别是
和系统相关的文件打开、命令执行等函数。
所有操作文件的函数将只能操作与脚本 UID 相同的文件,比如 test.php 脚本的内容为:
<?include("index.html")?>
几个文件的属性如下:
# ls
-la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr-x 16 root root 384 Jul 18 12:02 ..
-rw-r--r-- 1 root root 4110 Oct 26 2002 index.html
-rw-r--r-- 1 www-data www-data 41 Jul 19 19:14 test.php
在浏览器请求 test.php 会提示如下的错误信息:
Warning: SAFE MODE Restriction
in
effect. The script whose uid/gid is 33/33 is not allowed to
access ./index.html owned by uid/gid 0/0
in
/var/www/test.php on line 1
如果被操作文件所在目录的 UID 和脚本 UID 一致 , 那么该文件的 UID 即使和脚本不同也可
以访问的 , 不知这是否是 PHP 的一个漏洞还是另有隐情 。 所 以 php 脚本属主这个用户最好
就只作这个用途 , 绝对禁止使用 root 做为 php 脚本的属主 , 这样就达不到 safe_mode 的效果
了。
如果想将其放宽到 GID 比较,则打开 safe_mode_gid 可以考虑只比较文件的 GID ,可以设
置如下选项: