
PHP是广泛使用的开源服务端脚本语言。通过HTTP或HTTPS协议,Apache Web服务允许用户访问文件或内容。服务端脚本语言的错误配置会导致各种问题。因此,PHP应该小心使用。以下是为系统管理员准备的,安全配置PHP的25个实践事例。

用于下文的PHP设置样例
下午列出的大部分操作,都是基于 root 用户能在 bash 或其他现代 shell 上执行操作的假设。
| 1 | $ php -v |
样例输出
| 123 | PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41)Copyright (c) 1997-2010 The PHP GroupZend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies |
本文使用的操作系统
| 1 | $ cat /etc/redhat-release |
样例输出
| 1 | Red Hat EnterPRise Linux Server release 6.1 (Santiago) |
#1:知彼
基于PHP的应用面临着各种各样的攻击:
#2:减少内建的PHP模块
执行下面指令可以查看当前PHP所编译的模块
| 1 | $ php -m |
样例输出:
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | [PHP Modules]apcbcmathbz2calendarCorectypecurldatedomeregexiffileinfofilterftpgdgettextgmphashiconvimapjsonlibxmlmbstringmemcachemysqlmysqliopensslpcntlpcrePDOpdo_mysqlpdo_sqlitePharreadlineReflectionsessionshmopSimpleXMLsocketsSPLsqlite3standardsuhosintokenizerwddxxmlxmlreaderxmlrpcxmlwriterxslzipzlib[Zend Modules] Suhosin |
从性能与安全性的角度考虑,我建议使用PHP时减少不必要的模块。例如上面的sqlite3是不必要的。那么可以通过删除或重命名/etc/php.d/sqlite3.ini文件来取消它:
| 1 | # rm /etc/php.d/sqlite3.ini |
或
| 1 | # mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable |
有些模块则只能通过使用重新编译安装PHP来移除。例如,从php.net下载PHP源码后,使用下面指令编译GD,fastcgi和MySQL支持:
| 1 | ./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc
|