二、 安全使用php
1、安装安全模块
php 的安全模式是为了试图解决共享服务器(shared-server)安全问题而设立的。在结构上,试图在 php 层上解决这个问题是不合理的,但修改 web 服务器层和操作系统层显得非常不现实。因此许多人,特别是 isp,目前使用安全模式。
表-1.安全模式配置指令
名称 | 默认值 | 类型 |
safe_mode | “0” | 布尔型 |
safe_mode_gid | “0” | 布尔型 |
safe_mode_include_dir | null | 字符串 |
safe_mode_exec_dir | “” | 字符串 |
safe_mode_allowed_env_vars | php_ | 字符串 |
safe_mode_protected_env_vars | ld_library_path | 字符串 |
disable_functions | “” | 字符串 |
disable_classes | “” | 字符串 |
open_basedir | null | 字符串 |
以下是该配置选项的简要解释。
(1)safe_mode boolean
是否启用 php 的安全模式。
(2)safe_mode_gid
默认情况下,安全模式在打开文件时会做 uid 比较检查。如果你想将其放宽到 gid 比较,则打开 safe_mode_gid。是否在文件访问时使用 uid(false)或者 gid(true)来做检查。
(3)safe_mode_include_dir
当从此目录及其子目录(目录必须在 include_path 中或者用完整路径来包含)包含文件时越过 uid/gid 检查。
从 php 4.2.0 开始,本指令可以接受和 include_path 指令类似的风格用分号隔开的路径,而不只是一个目录。
(4)safe_mode_exec_dir
如果 php 使用了安全模式,system() 和其它执行系统程序的函数将拒绝启动不在此目录中的程序。
(5)safe_mode_allowed_env_vars
设置某些环境变量可能是潜在的安全缺口。本指令包含有一个逗号分隔的前缀列表。在安全模式下,用户只能改变那些名字具有在这里提供的前缀的环境变量。默认情况下,用户只能设置以 php_ 开头的环境变量(例如 php_foo = bar)。
(6)safe_mode_protected_env_vars
本指令包含有一个逗号分隔的环境变量的列表,最终用户不能用 putenv() 来改变这些环境变量。甚至在 safe_mode_allowed_env_vars 中设置了允许修改时也不能改变这些变量。
(7)disable_functions
本指令允许你基于安全原因禁止某些函数。接受逗号分隔的函数名列表作为参数。 disable_functions 不受安全模式的影响。 本指令只能设置在 php.ini 中。例如你不能将其设置在 httpd.conf。
(8)disable_classes
本指令可以使你出于安全的理由禁用某些类。用逗号分隔类名。disable_classes 不受安全模式的影响。 本指令只能设置在 php.ini 中。例如你不能将其设置在 httpd.conf。该指令自 php 4.3.2 起可用。
(9)open_basedir
将 php 所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。
2、以安全模式运行php
以安全模式运行php是使php脚本安全使用的好方法,特别是在允许用户使用自己开发的php脚本时。使用安全模式会使php在运行函数时检查是否存在安全问题。include、readfile、fopen、file、unlink、rmdir等等:被包含的文件或者该文件所在目录的所有者必须是正在运行的脚本的所有者; exec、system、passthm等:要执行的程序必须位于特定的目录(默认为/usr/local/php/bin)。编译php时可以用- -with-exe-dir选项设定这个值。
mysql_connect:这个函数用可选的用户名连接mysql数据库。在安全模式下,用户名必须是当前被执行的脚本的所有者,或运行httpd的用户名(通常是nobody)。
http authentication:包含http验证代码脚本所有者的用户id(数字型)会自动加到验证域。这样可以防止有人通过抓取密码的程序来欺骗同一个服务器上的http验证脚本。