PHP Conference Japan 2024

作为 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 的活动限制在非用户或非系统文件上。

添加注释

用户贡献的注释 3 条注释

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 之神得出结论并给我们提供最佳实践。
To Top