PHP是一种跨平台的服务器端的嵌入式脚本语言它大量地借用CJava和Perl语言的语法 并耦合PHP自己的特性使WEB开发者能够快速地写出动态产生页面最新版本PHP支持目前绝大多数数据库(MysqlPostgreSQLOracleDBSybase等)还有一点PHP是完全免费的不用花钱你可以从PHP官方站点)自由下载PHP拓展了WEB Server的功能实现了Web最佳服务的后端延展界面见图-
图- PHP拓展了WEB Server的功能PHP全称Professional HyperText PreProcessor以最新的PHP为例支持它的WEB服务器有Apache Microsoft Internet information Sereve Microsoft Personal web Server AOL server Netscape Enterprise 等等
PHP是一种功能强大的语言和解释器无论是作为模块方式包含到web服务器里安装的还是作为单独的CGI程序程序安装的都能访问文件执行命令或者在服务器上打开链接而这些特性都使得PHP运行时带来安全问题
虽然PH P是特意设计成一种比用Perl或C语言所编写的CGI程序要安全的语言但正确使用编译时和运行中的一些配置选项以及恰当的应用编码将会保证其运行的安全性由于我们可以在很多不同的方面利用 PHP因此它有很多设置选项来控制其行为
一组庞大的可选参数能够保证您可以将 PHP 用于许多不同的目的但这同时也意味着这些参数和服务端配置的组合会带来一些安全问题 PHP 的配置与其代码相比有着同样的灵活性PHP 可以用来建立完整的服务端应用程序拥有所有外壳用户的权限它也可以在被严格控制的环境下用作一个简单的服务端包含仅承担很小的风险您如何建立该环境以及其安全性如何在很大程度上取决于 PHP 的开发者 注本文所有操作在Red Hat Linux 下完成
一 安全从头开始
在编译PHP之前首先确保操作系统的版本是最新的必要的补丁程序必须安装过安装编译PHP过程中要注意的个问题
使用Apachetoolbox整合ApachePHPMysql 目前最好的web建站黄金组合是Linux+Apache+Mysql+PHP 但是在实际工作过程中需要分别下载安装配置apachephp和mysql并且需要根据具体情况修改apache的 php的phpini还有mysql的配置文件如果你还需要提供ssl功能那还得下载正确的ssl apache模块并定制它的ini文件等其中的任何步骤出现问题都会导致网站不能正确运行
想一次完全配置成功即使对于一个经验丰富的Linux网络管理员也比较困难Apache Toolbox是用shell脚本写成的Apache Toolbox可以很很方便的使你定制你的apache按您的要求在Apache支持的个第三方的软件包以及个模块中选择
定制的过程完全用菜单驱动而且都有简单的说明所有的组件都是用源代码方式安装在安装过程中如果发现RPM包有问题它还会用wget去重新下载新的可用的组件包相信对那些网络管理员是一个有用的工具
Apache Toolbox 可以在GUN命令行下安装也可以在X窗口下安装为了方便读者阅读本文以在X窗口下安装为例在w下载最新的apachetoolbox安装包包括apachemysqlphpPython PostgresSQLv等常用建站软件和APC (一种为PHP提供Cache的模块)Apache Toolbox Apache Toolbox提供了一个简单的编译Apache方法能让你很容易地安装Apache SSLPHP ZendOptimizer mod_authndsmoddynvhostWebDAVmod_fastcgimod_gzipmod_layoutmod_throttlemod_accessref mod_auth_sys mod_bandwidth mod_auth_ldap mod_perl openldap等等以及最新的支持PNG格式的 gd 库它支持完全的菜单界面
图- Apachetoolbox安装界面按照Apache 模块安装当 PHP 被用作 Apache 的模块时它将继承 Apache 的用户权限(典型情况为用户nobody) 这将对安全及授权机制产生一些沖击
例如如果您使用 PHP 来访问数据库除非数据库本身有内建的访问控制否则您将使得数据库能够被用户nobody访问这意味着恶意的脚本能够访问并修改数据库甚至不需要用户名和密码网络黑客无意中访问到了数据库管理员的 WEB 页面并通过这里删除所有的数据库是完全有可能发生的
您可以利用 Apache 的认证机制来防止这些的发生或者也可以利用 LDAP 或 htaccess 文件等来设计您自己的访问模式并将这些代码包含为您 PHP 脚本的一部分
通常一旦安全机制建立并使得 PHP 的用于(在这种情况下为 Apache 用户)仅为此承担很小的风险时我们发现 PHP 此时被禁止往用户目录写入任何文件或者还有可能被禁止访问和更改数据库无论往防止的对象中写入文件的好坏以及进入的数据库事务的好坏其安全性都是同等的
在这个时候一个频繁出现的安全错误是给 Apache root 权限或者用其它方法提升 Apache 的能力
给 Apache 用户赋予 root 权限是及其危险的而且有可能会连累整个系统因此进行 sudochroot或者以 root 账号运行等操作不应该考虑让那些非安全专家来执行 还有一些更简单的情况您可以使用 open_basedir 来控制和限制 PHP 能够使用的目录您还可以建立 Apache 的专用区域以将所有基于 WEB 的活动都限制到非用户系统和文件
把PHP解析器放在Web目录外
一种安全性非常高的方法是把 PHP 解析程序放置到 WEB 文件目录树以外的某个地方例如放置到 /usr/local/bin这种做法唯一的弊病就是您现在需要在所有含有 PHP 标记符文件的第一行添加类似于以下的内容
#!/usr/local/bin/php
您需要使得这些文件成为可执行文件也就是说像对待任何其它 CGI 脚本一样来对待它们这些 CGI 脚本可能是用 Perlsh 或者任何其它使用的 #! shellescape 机制来启动它们自身的脚本语言来编写的要使这个方法中 PHP 能够正确处理 PATH_INFO 和 PATH_TRANSLATED 信息在编译 PHP 解析器时必须使用配置参数enablediscardpath下面是一个能作为CGI程序运行的PHP脚的例子
#!/usr/local/bin/phpecho
This is amy smallprogram
最后将PHP请升级为最新稳定版本
在PHP 中添加了一组特殊数据以访问外部数据这些数组可以在任何范围内调用这使得外部数据的访问更方便在PHP 中register_globals被默认关闭以鼓励使用这些数组以避免无经验的开发者编写出不安全的PHP代码作出这样的变化是出于安全性的考虑的链接/downloadsphp
二 安全使用PHP
安装安全模块
PHP 的安全模式是为了试图解决共享服务器(sharedserver)安全问题而设立的在结构上试图在 PHP 层上解决这个问题是不合理的但修改 WEB 服务器层和操作系统层显得非常不现实因此许多人特别是 ISP目前使用安全模式
表安全模式配置指令
以下是该配置选项的简要解释
()safe_mode boolean
是否启用 PHP 的安全模式
()safe_mode_gid
默认情况下安全模式在打开文件时会做 UID 比较检查如果你想将其放宽到 GID 比较则打开 safe_mode_gid是否在文件访问时使用 UID(FALSE)或者 GID(TRUE)来做检查
()safe_mode_include_dir
当从此目录及其子目录(目录必须在 include_path 中或者用完整路径来包含)包含文件时越过 UID/GID 检查
从 PHP 开始本指令可以接受和 include_path 指令类似的风格用分号隔开的路径而不只是一个目录
()safe_mode_exec_dir
如果 PHP 使用了安全模式system() 和其它执行系统程序的函数将拒绝启动不在此目录中的程序
()safe_mode_allowed_env_vars
设置某些环境变量可能是潜在的安全缺口本指令包含有一个逗号分隔的前缀列表在安全模式下用户只能改变那些名字具有在这里提供的前缀的环境变量默认情况下用户只能设置以 PHP_ 开头的环境变量(例如 PHP_FOO = BAR)
()safe_mode_protected_env_vars
本指令包含有一个逗号分隔的环境变量的列表最终用户不能用 putenv() 来改变这些环境变量甚至在 safe_mode_allowed_env_vars 中设置了允许修改时也不能改变这些变量
()disable_functions
本指令允许你基于安全原因禁止某些函数接受逗号分隔的函数名列表作为参数 disable_functions 不受安全模式的影响 本指令只能设置在 phpini 中例如你不能将其设置在
()disable_classes
本指令可以使你出于安全的理由禁用某些类用逗号分隔类名disable_classes 不受安全模式的影响 本指令只能设置在 phpini 中例如你不能将其设置在 该指令自 PHP 起可用
()open_basedir
将 PHP 所能打开的文件限制在指定的目录树包括文件本身本指令不受安全模式打开或者关闭的影响
以安全模式运行PHP