一、CGI模式安装安全
二、以Apache模块安装安全
当 PHP 以 Apache 模块方式安装时,它将继承 Apache 用户(通常为“nobody”)的权限。这对安全和认证有一些影响。比如,如果用 PHP 来访问数据库,除非数据库有自己的访问控制,否则就要使“nobody”用户可以访问数据库。这意味着恶意的脚本在不用提供用户名和密码时就可能访问和修改数据库。一个 web Spider 也完全有可能偶然发现数据库的管理页面,并且删除所有的数据库。可以通过 Apache 认证来避免此问题,或者用 LDAP、.htaccess 等技术来设计自己的防问模型,并把这些代码作为 PHP 脚本的一部份
一个常犯的对安全性不利的错误就是让 Apache 拥有 root 权限,或者通过其它途径斌予 Apache 更强大的功能。
把 Apache 用户的权限提升为 root 是极度危险的做法,而且可能会危及到整个系统的安全。所以除非是安全专家,否则决不要考虑使用 su,chroot 或者以 root 权限运行。
除此之外还有一些比较简单的解决方案。比如说可以使用 open_basedir 来限制哪些目录可以被 PHP 使用。也可以设置 Apache 的专属区域,从而把所有的 web 活动都限制到非用户和非系统文件之中。
三、文件系统安全
PHP 遵从大多数服务器系统中关于文件和目录权限的安全机制。这就使管理员可以控制哪些文件在文件系统内是可读的。必须特别注意的是全局的可读文件,并确保每一个有权限的用户对这些文件的读取动作都是安全的。
PHP 被设计为以用户级别来访问文件系统,所以完全有可能通过编写一段 PHP 代码来读取系统文件如 /etc/passwd,更改网络连接以及发送大量打印任务等等。因此必须确保 PHP 代码读取和写入的是合适的文件。
两个重要措施来防止此类问题。
# 只给 PHP 的 web 用户很有限的权限。
# 检查所有提交上来的变量。
$username = $_SERVER['REMOTE_USER']; // 使用认证机制$userfile = $_POST['user_submitted_filename'];$homedir = "/home/$username";$filepath = "$homedir/$userfile";if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|/.(?!/.))+$/iD', $userfile)) { die("Bad username/filename");}
* Null字符问题
由于 PHP 的文件系统操作是基于 C 语言的函数的,所以它可能会以您意想不到的方式处理 Null 字符。 Null字符在 C 语言中用于标识字符串结束,一个完整的字符串是从其开头到遇见 Null 字符为止。
# 会被 Null 字符问题攻击的代码:
$file = $_GET['file']; // "http://www.cnblogs.com/etc/passwd/0"if (file_exists('/home/wwwrun/'.$file.'.php')) { // file_exists will return true as the file /home/wwwrun/http://www.cnblogs.com/etc/passwd exists include '/home/wwwrun/'.$file.'.php'; // the file /etc/passwd will be included}
新闻热点
疑难解答