安装为 Apache 模块

PHP 用作 Apache 模块时,它会继承 Apache 的用户权限(通常是“nobody”用户的权限)。这会对安全性和授权产生多种影响。例如,如果您正在使用 PHP 访问数据库,除非该数据库具有内置的访问控制,否则您必须使数据库对“nobody”用户可用。这意味着恶意脚本可以访问和修改数据库,即使没有用户名和密码。完全有可能一个网络蜘蛛会偶然发现一个数据库管理员的网页,并删除您的所有数据库。您可以使用 Apache 授权来防止这种情况,或者您可以使用 LDAP、.htaccess 文件等设计自己的访问模型,并将该代码作为您 PHP 脚本的一部分。

通常,一旦安全措施建立到 PHP 用户(在本例中为 apache 用户)几乎没有风险的程度,就会发现 PHP 现在被阻止写入任何文件到用户目录。或者它可能被阻止访问或更改数据库。它同样被阻止写入良好和不良文件,或进行良好和不良的数据库事务。

此时经常犯的一个安全错误是允许 apache 根权限,或以其他方式提升 apache 的能力。

提升 Apache 用户的权限到 root 非常危险,可能会危及整个系统,因此那些不是安全专业人员的人不应考虑使用 sudo、chroot 或以其他方式以 root 身份运行。

有一些更简单的解决方案。通过使用 open_basedir,您可以控制和限制允许用于 PHP 的目录。您还可以设置仅限 apache 的区域,以将所有基于 Web 的活动限制在非用户或非系统文件。

添加注释

用户贡献注释 5 个注释

bk 2 at me dot com
12 年前
doc_root 已经限制了 apache/php 脚本文件夹的位置。

open_basedir 更好地用于限制脚本对文件夹的访问
这些文件夹不包含脚本。可以是 doc_root 的子文件夹,如 php 文档示例 doc_root/tmp,但最好是在单独的文件夹树中,如 ~user/open_basedir_root/。如果 doc_root(或 include_path)和 open_basedir 重叠,有害脚本可能会修改其他脚本。
如果 apache/php 无法浏览 open_basedir 中的脚本,即使恶意脚本将更多不良脚本上传到那里,它们也无法被浏览(执行)。

还应该注意,许多 shell 执行函数实际上是绕过 open_basedir 限制的一种方法,如果安全要求严格的文件夹访问控制,则应禁用这些函数。如果允许通过这些函数执行本机操作系统 shell 命令,有害脚本可以执行 unix/windows 版本的“delete */*/*/*”。操作系统 shell 命令同样可以通过蛮力将文件复制到 doc_root 树中,来绕过重定向限制和上传文件限制。如果可以将它们作为一组或一类函数禁用就好了,但如果出于安全原因需要,仍然可以逐个禁用它们。

PS。目前存在一个错误,即如果执行任何 include 或 require 语句,open_basedir 设置为 docroot/tmp 的文档设置将不起作用。目前,如果包含的 php 文件既不在 open_basedir 树中也不在 doc_root+include_path 树中,则 include 会失败。这与安全相反。
这意味着任何包含的 php 文件都必须在 open_basedir 中,因此容易受到有害脚本和 Injektor 等 php 病毒的攻击。
daniel dot eckl at gmx dot de
22 年前
有一个比在单独的实例中启动每个虚拟主机更好的解决方案,这样会浪费资源。

您可以为每个虚拟主机动态设置 open_basedir,因此每个虚拟主机上的 PHP 脚本都限制在其文档根目录中。

示例
<VirtualHost www.example.com>
ServerName www.example.com
DocumentRoot /www-home/example.com
[...]
<Location />
php_admin_value open_basedir \ "/www-home/example.com/:/usr/lib/php/"
</Location>
</VirtualHost>

如果您开启 safe_mode,那么脚本只能使用给定目录中的二进制文件(创建一个仅包含客户可能使用的二进制文件的特殊目录)。

现在,您的机器上每个虚拟主机的用户都无法读取、写入或修改其他用户的數據。

Windseeker
joe
2 年前
对于普通用户来说,在没有明确列出解决问题的逐步方法的情况下,就使用 PHP 的安全性不足进行辩论毫无用处。这些方法应该由 PHP 权威地提供,而不是作为用户的意见,然后由另一个用户进行辩论。

我不是反对辩论。这是我们作为开源社区学习的方式。但是,我们这些凡人需要 PHP 的神灵得出结论并为我们提供最佳实践。
Vikanich
16 年前
非常感谢“daniel dot eckl at gmx dot de”,但我必须更改他的配置,因为它不起作用(可能是语法错误)。
我在 VirtualHost 配置中只添加了这行字符串,它起作用了。
php_admin_value open_basedir /www/site1/
现在所有 php 脚本都被锁定在该目录中。
Kibab
18 年前
我正在运行 Windows 版本的 Apache,其中 php 作为模块。系统是 Windows XP Service Pack 2,在 NTFS 文件系统上。为了避免潜在的安全问题,我将 Apache 设置为在 NT AUTHORITY\Network Service 帐户下运行,并且只有一个名为 Content 的目录,该帐户对此目录具有完全访问权限。其他目录要么完全无法访问,要么具有只读权限(例如 %systemroot%)... 因此,即使 Apache 被破坏,整个系统也不会受到影响,因为该帐户没有管理员权限 :)
To Top