名字 | 默认 | 可修改范围 | 更新日志 |
---|---|---|---|
safe_mode | "0" | PHP_INI_SYSTEM | |
safe_mode_gid | "0" | PHP_INI_SYSTEM | 自 PHP 4.1.0 起可用,在 PHP 5.4.0 中移除。 |
safe_mode_include_dir | NULL | PHP_INI_SYSTEM | 自 PHP 4.1.0 起可用 |
safe_mode_exec_dir | "" | PHP_INI_SYSTEM | |
safe_mode_allowed_env_vars | "PHP_" | PHP_INI_SYSTEM | |
safe_mode_protected_env_vars | "LD_LIBRARY_PATH" | PHP_INI_SYSTEM |
这是配置指令的简短说明。
safe_mode
boolean
是否启用 PHP 的安全模式。
safe_mode_gid
boolean
默认情况下,安全模式在打开文件时会做 UID 比较检查。如果想将其放宽到
GID 比较,则打开 safe_mode_gid。是否在文件访问时使用
UID(FALSE
)或者
GID(TRUE
)来做检查。
safe_mode_include_dir
string
当从此目录及其子目录(目录必须在 include_path 中或者用完整路径来包含)包含文件时越过 UID/GID 检查。
从 PHP 4.2.0 开始,本指令可以接受和 include_path 指令类似的风格用冒号(Windows 中是分号)隔开的路径,而不只是一个目录。 指定的限制实际上是一个前缀,而非一个目录名。这也就是说“safe_mode_include_dir = /dir/incl”将允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果希望将访问控制在一个指定的目录,那么请在结尾加上一个斜线,例如:“safe_mode_include_dir = /dir/incl/”。 如果本指令的值为空,在 PHP 4.2.3 中以及 PHP 4.3.3 起具有不同 UID/GID 的文件将不能被包含。在较早版本中,所有文件都能被包含。safe_mode_exec_dir
string
如果 PHP 使用了安全模式, system() 和其它程序执行函数将拒绝启动不在此目录中的程序。必须使用 / 作为目录分隔符,包括 Windows 中。
safe_mode_allowed_env_vars
string
设置某些环境变量可能是潜在的安全缺口。本指令包含有一个逗号分隔的前缀列表。在安全模式下,用户只能改变那些名字具有在这里提供的前缀的环境变量。默认情况下,用户只能设置以 PHP_ 开头的环境变量(例如 PHP_FOO = BAR)。
Note:
如果本指令为空,PHP 将使用户可以修改任何环境变量!
safe_mode_protected_env_vars
string
本指令包含有一个逗号分隔的环境变量的列表,最终用户不能用 putenv() 来改变这些环境变量。甚至在 safe_mode_allowed_env_vars 中设置了允许修改时也不能改变这些变量。
参见 open_basedir、 disable_functions、 disable_classes、 register_globals、 display_errors 和 log_errors。
当 safe_mode 设置为 on,PHP 将通过文件函数或其目录检查当前脚本的拥有者是否和将被操作的文件的拥有者相匹配。例如:
-rw-rw-r-- 1 rasmus rasmus 33 Jul 1 19:20 script.php -rw-r--r-- 1 root root 1116 May 26 18:01 /etc/passwd
<?php
readfile('/etc/passwd');
?>
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
同时,或许会存在这样的环境,在该环境下,宽松的 GID 检查已经足够,但严格的 UID 检查反而是不适合的。可以用 safe_mode_gid 选项来控制这种检查。如果设置为 On 则进行宽松的 GID 检查;设置为 Off(默认值)则进行 UID 检查。
除了 safe_mode 以外,如果设置了 open_basedir 选项,则所有的文件操作将被限制在指定的目录下。例如:
<Directory /docroot> php_admin_value open_basedir /docroot </Directory>
Warning: open_basedir restriction in effect. File is in wrong directory in /docroot/script.php on line 2
也可以单独地屏蔽某些函数。请注意 disable_functions 选项不能在 php.ini 文件外部使用,也就是说无法在 httpd.conf 文件的按不同虚拟主机或不同目录的方式来屏蔽函数。如果将如下内容加入到 php.ini 文件:
disable_functions readfile,system
Warning: readfile() has been disabled for security reasons in /docroot/script.php on line 2
当然,这些 PHP 限制不适用于可执行文件。
bill1 at nospam dot windhome dot com (2012-02-04 22:02:19)
The example of setting open_basdir to docroot has the effect of protecting files outside the web site but does NOT PROTECT files INSIDE the website, and could be construed as a suggested use. There is no reason to use open_basedir at all except to protect from misbehaving scripts. If there is a misbehaving script, one would not like it to delete, modify or upload files to the core website either. An example of a safer setting for open_basedir would be /docroot/safedir (or as is used in doc page "Description of core php.ini directives",open_basedir Note, to tighten it from /www/ to /www/tmp).
rayro at gmx dot de (2009-01-31 11:18:12)
Theres a failure with open_basedir and per-host configuration
in apache as described in bug #42836: http://bugs.php.net/bug.php?id=42836
I got the same errors on my development windows system and apache 2.2.4 with php 5.3.beta1.
This error (or similar) is shown:
Warning: Unknown: open_basedir restriction in effect. File(...)
is not within the allowed path(s): (? ?? ?@5?,?)
Fix:
- try slashes at the end of the folder name
or
- put "php_admin_value open_basedir ..." at first of all in the configuration