php安全模式:safe_mode=on|off
启用safe_mode指令将对在共享环境中使用PHP时可能有危险的语言特性有所限制。可以将safe_mode是指为布尔值on来启用,或者设置为off禁用。它会比较知性脚本UID(用户ID)和脚本尝试访问的文件的UID,以此作为限制机制的基础。如果UID相同,则知性脚本;否则,脚本失败。
具体地,当启用安全模式时,一些限制将生效。
1、所有输入输出函数(例如fopen()、file()和require())的适用会受到限制,只能用于与调用这些函数的脚本有相同拥有者的文件。例如,假定启用了安全模式,如果Mary拥有的脚本调用fopen(),尝试打开由Jonhn拥有的一个文件,则将失败。但是,如果Mary不仅拥有调用fopen()的脚本,还拥有fopen()所调用的文件,就会成功。
2、如果试图通过函数popen()、system()或exec()等执行脚本,只有当脚本位于safe_mode_exec_dir配置指令指定的目录才可能。
3、HTTP验证得到进一步加强,因为验证脚本用于者的UID划入验证领域范围内。此外,当启用安全模式时,不会设置PHP_AUTH。
4、如果适用MySQL数据库服务器,链接MySQL服务器所用的用户名必须与调用mysql_connect()的文件拥有者用户名相同。
安全模式和禁用的函数
下面是启用safe_mode指令时受影响的函数、变量及配置指令的完整列表:
apache_request_headers() backticks()和反引号操作符 chdir()
chgrp()
copy()
dl()
filepro_retrieve()
header()
ingres_*
max_execution_time()
mysql_*
pg_lo_import()
putenv()
set_time_limit()
symlink()
以下是一些和安全模式相关的配置选项
safe_mode_gid=on|off
次指令会修改安全模式的行为,即从执行前验证UID改为验证组ID。例如,如果Mary和John处于相同的用户组,则Mary的脚本可以对John的文件调用fopen()。
safe_mode_include_dir=string
可以使用指令safe_mode_include_dir指示多个路径,启用安全模式时在这些路径中将忽略安全模式。例如,你可以使用此函数指定一个包含不同模板的目录,致谢模板可能会继成到一些用户网站。可以指定多个目录,在基于UNIX的系统各目录用冒号分隔,在Windows中用分号分隔。
注意,如果指定某个路径但未包含最后的斜线,则该路径下的所有目录都会忽略安全模式设置。例如,如果设置次指令为/home/configuration,表示/home/configuration/templates/和/home/configureation/passwords都排除在安全模式限制之外。因此,如果只是要排除一个目录或一组目录不受安全模式设置的限制,要确保每个目录都包括最后的斜线。
safe_mode_env_vars=string
当启用安全模式时,可以只用次指令允许执行用户的脚本修改某些环境变量。可以允许修改多个变量,每个变量之间用逗号分隔。
safe_mode_exec_dir=string
次指令指定一些目录,其中的系统程序可以通过诸如system()、exec()或passthru()等函数执行。为此必须启用安全模式。此指令有一个奇怪的地方,在所有操作系统中(包括Windows),都必须使用斜线(/)作为目录的分隔符。
safe_mode_protected_env_vars=string
此指令保护某些环境变量不能被putenv()函数修改。默认情况下,变量LD_LIBRARY_PATH是受保护的,因为如果在运行时修改这个变量可能导致不可预知的结果。关于此环境变量的更多信息,请参考搜索引擎或Linux手册。注意,本届中声明的所有便来弄个都覆盖safe_mode_allowed_env_vars指令中声明的变量。
PHP勿庸置疑是非常强大的服务器端脚本语言,但是强大的功能总是伴随着重大的危险,在这章里,你将学习到使用PHP的安全模式来阻止一些PHP潜在的危险因素。
【 安全模式 】
PHP的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的PHP开放的Web服务器上。当一个Web服务器上运行的PHP打开了安全模式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。
[ 使用安全模式来强制限制 ]
在安全模式下,一些尝试访问文件系统的函数功能将被限制。运行Web服务器用户ID,如果想要操作某个文件,则必须拥有该文件读取或者写入的访问权限,实现这个限制功能对于PHP来说是没有问题的。
在
安全模式开启的时候,尝试读取或者写入一个本地文件的时候,PHP将检查当前访问用户是否是该目标文件的所有者。如果不是所有者,则该操作会被禁止。(写
入权限:在较低级别的文件访问权限下,可能会允许读取或者写入系统操作系统的文件,通过PHP的安全模式实现了防止你操作另外一个用户文件的操作。当然,
一个Web服务器可能能够访问一个具有全局写入权限的任意文件。)
当安全模式打开的时候,以下函数列表的功能将会受到限制:
chdir , move_uploaded_file, chgrp, parse_ini_file, chown,
rmdir, copy,
rename, fopen, require, highlight_file, show_source, include,
symlink, link,
touch, mkdir, unlink
同样的,一些PHP扩展中的函数也将会受到影响。(加载模块:在安全模式下dl函数将被禁止,如果要加载扩展的话,只能修改php.ini中的扩展选项,在PHP启动的时候加载)
在PHP安全模式打开的时候,需要执行操作系统程序的时候,必须是在safe_mode_exec_dir选项指定目录的程序,否则执行将失败。即使允许执行,那么也会自动的传递给escapeshellcmd函数进行过滤。
以下执行命令的函数列表将会受到影响:
exec, shell_exec, passthru, system, popen
另外,背部标记操作符(`)也将被关闭。
当运行在安全模式下,虽然不会引起错误,但是 putenv
函数将无效。同样的,其他一些尝试改变PHP环境变量的函数set_time_limit,
set_include_path 也将被忽略。
[ 打开安全模式 ]
打开或者关闭PHP的安全模式是利用php.ini中的safe_mode选项。如果要激活安全模式给当前所有共享Web服务器的用户,只要设置配置选项为:safe_mode
=
On当函数在访问文件系统的时候将进行文件所有者的检查。缺省情况下,会检查该文件所有者的用户ID,当你能够修改文件所有者的组ID(GID)为
safe_mode_gid 选项所指定的。如
果你有一个共享库文件在你的系统上,当你碰到需要include或require的时候,那么你可以使用
safe_mode_include_dir 选项来设置你的路径,保证你的代码正常工作。(包含路径: 如果你想要使用
safe_mode_include_dir
选项包含更多的包含路径,那么你可以象 include_path
选项一样,在Unix/Linux系统下使用冒号进行分割,在Windows下使用分号进行分割)比如你想要在安全模式下包含
/usr/local/include/php 下的文件,那么你可以设置选项为:safe_mode_include_dir
=
/usr/local/include/php如果你的包含的文件是需要执行的,那么你可以设置 safe_mode_exec_dir
选项。比如你需要
/usr/local/php-bin 路径下的文件是可以执行的,那么可以设置选项为:safe_mode_exec_dir
=
/usr/local/php-bin(可执行:如果你执行的程序在 /usr/bin
目录下,那么你可以把这些的二进制文件,连接到你指定选项下能够执行的路径)如果你想设置某些环境变量,那么可以使用
safe_mode_allowed_env_vars 选项。这个选项的值是一个环境变量的前缀,缺省是允许 PHP_
开头的环境变量,如果你想要改变,可以设置该选项的值,多个环境变量前缀之间使用逗号进行分割。比如下面允许时区的环境变量 TZ
,那么修改该选项的值为:safe_mode_allowed_env_vars = PHP_,TZ【 其他的安全特征
】除了安全模式以外,PHP还提供了许多其他许多特征来保证PHP的安全。
[ 隐藏PHP ]
你能够在php.ini里使用 expose_php 选项来防止Web服务器泄露PHP的报告信息。如下:expose_php
=
On利用整个设置,你能够阻碍一些来自自动脚本针对Web服务器的攻击。通常情况下,HTTP的头信息里面包含了如下信息:Server:
Apache/1.3.33
(Unix) PHP/5.0.3 mod_ssl/2.8.16
OpenSSL/0.9.7c在 expose_php
选项打开以后,PHP的版本信息将不包含在上面的头信息里。当然,用户访问网站的时候同样能够看到
.php 的文件扩展名。如果你想整个的使用不同的文件扩展名,你需要在 httpd.conf 中找到如下这行:AddType
application/x-httpd .php你就可以修改 .php
为任何你喜欢的文件扩展名。你能够指定任意多个的文件扩展名,中间使用空格进行分割。如果你想在服务器端使用PHP来解析 .html 和
.htm
文件的时候,那么你设置选项如下:AddType application/x-httpd .html
.htm(解析HTML:配置你的Web服务器使用PHP去解析所有的HTML文件,但是如果非服务器端代码也需要PHP去解析,会影响服务器的性能。静态页面你可以使用不同的扩展名,这样能够消除对PHP脚本引擎的依赖,增强性能。)
[ 文件系统安全 ]
安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用 open_basedir
选现来指定一个你必须访问的目录。如果你指定了一个目录,PHP将拒绝访问除了该目录和该目录子目录的其他目录。open_basedir
选项能够工作在安全模式之外。限制文件系统只能访问 /tmp 目录,那么设置选项为:open_basedir = /tmp[
函数访问控制 ]你能够在
disable_functions
选项中使用逗号分割来设定函数名,那么这些函数将在PHP脚本中被关闭。这个设置能够工作在安全模式之外。disable_functions
=
[ 数据库安全 ]
假设你的PHP脚本中包含一个基于表单值来执行的Mysql查询:$sql = “UPDATE mytable SET col1 = ” .