如何限制 PHP 对 DOCUMENT_ROOT 的文件访问

Posted

技术标签:

【中文标题】如何限制 PHP 对 DOCUMENT_ROOT 的文件访问【英文标题】:How to Restrict PHP's File Access to DOCUMENT_ROOT 【发布时间】:2012-04-03 15:02:42 【问题描述】:

是否可以限制 php 对其文档根目录的文件访问?基本上,在我工作的服务器上,我们的域的文件结构如下:

/home/something/domains/domain1/ /home/something/domains/domain2/ /home/something/domains/domain3/

目前,domain1 上的任何脚本都可以读取和写入 /home/something/domains/ 中的任何内容,包括我们所有其他域。我想将 domain1 中脚本的文件访问限制为仅该域。

服务器由 mediatemple 托管,它是他们的网格服务,所以我没有 root 访问权限,甚至没有 vhost 配置访问权限。我们可以更改 php.ini,我知道它提供了 open_basedir,但这听起来并不能解决我的问题,因为我只能限制对 /domians/ 的文件访问,而不是单个域。任何帮助表示赞赏。

我真正想做的事:

此服务器最近被黑客入侵,黑客正在覆盖影响我们所有网站的 domain/.htaccess。我们有大量的网站,其中许多有很多糟糕的代码行。他们上传了 WSO,这是一个黑客后门/shell,可以让他们完全访问所有内容。我不知道他们是如何获得访问权限的,我猜是来自 timthumb 漏洞利用,数百万行错误代码之一,或者他们只是以某种方式获得了我们的 FTP 密码。我们更新了旧的 timthumbs,更改了密码并删除了我们发现的所有坏文件,但由于他们发现的任何漏洞利用都很有可能仍在服务器上,或者我们错过了一些后门,我至少想限制他们的访问到包含漏洞利用或未发现后门的实际域。

【问题讨论】:

服务器的操作系统是什么?您熟悉配置 SELinux 吗? 这听起来不像是解决被黑客入侵问题的方法。 服务器是 Cent 操作系统,但我们非常有限,因为它是一个奇怪的共享托管环境。我知道解决方案是审核代码并确保我们不会让人们上传 php 文件或以某种方式通过不安全的做法获得访问权限,但不幸的现实是我们有超过一百万行可怕的、不可读的代码并保护它不可行。我已经 grepped eval 并获得了数千次点击。我只是不知道该怎么办。 【参考方案1】:

我最初的想法是为每个虚拟主机设置open_basedir(即使您必须要求主机管理员为您设置),但我怀疑这是否可行,因为I am fairly certain external/shell commands that run in PHP/scripts will still work on directories outside of the designated tree。

经过更多考虑,我能想到的最接近的配置设置并获得所需内容的方法是为每个虚拟主机设置 chroot-jailed 用户帐户,并让您的网络服务器通过一种机制使用这些用户帐户就像Apache 2 MPM ITK 一样,我只能假设您的托管服务提供商在设置时会遇到问题。

【讨论】:

感谢您的回复。我考虑过在每个虚拟主机的基础上设置 open_basedir,但是当我询问禁用 .htaccess 文件和/或将我们的 url 重写移动到虚拟主机文件中的能力时,他们说“在网格上,你不能修改 Apache Web 服务器配置.所有 Apache 指令都需要包含在 .htaccess 文件中。”因为他们甚至不让我修改虚拟主机配置,我非常怀疑他们会接受像被监禁的用户帐户这样的东西。我想他们的限制让你们几乎不可能帮助我:( 您的问题可能会在serverfault 甚至superuser 上得到更好的答案。我是一个有一点服务器管理经验的开发人员,一个真正的服务器管理员可能会给你更好的答案。或者他可能只是说你的主人是你的问题。 :-) 哈哈谢谢。在整个考验过程中,这种托管环境一直是个问题。我想我们只是希望我们摆脱了他们的访问权限,如果它回来了,就转移到我们拥有 root 访问权限的服务器上来做我们需要做的事情。谢谢你的时间。

以上是关于如何限制 PHP 对 DOCUMENT_ROOT 的文件访问的主要内容,如果未能解决你的问题,请参考以下文章

nginx+php使用open_basedir限制站点目录防止跨站

如何在没有作曲家的情况下使用PHP库(FPDI与FPDI保护)

nginx 和 $document_root 上的斜杠?

如何通过 IP 限制对我的 PHP 弹性 beanstalk 环境的访问?

php读取excel文件数据

PHP - 如何访问文件的正确路径?