【问题标题】:Files written though PHP/Apache don't honor directory setgid bit通过 PHP/Apache 编写的文件不支持目录 setgid 位
【发布时间】:2011-12-04 22:05:57
【问题描述】:

在这个问题上摸不着头脑,似乎很基础。

我有一个由承包商为我们的网站编写的基于 PHP 的内容管理系统。一项功能是能够上传图片以显示在网站的不同位置(如产品库)。所有这些上传的图片都存储在一个名为“附件”的特定目录中。

drwxrwsr-x 4 www ftpusers 4096 Oct 10 14:47 附件

如您所见,我已在该目录上设置了 setgid 位,因此写入的任何文件都将具有需要访问这些文件的用户(如 FTP 用户)能够修改/覆盖它们的组。我已经为 Apache 设置了 umask,以便它将文件写入组可写。

当我通过在该目录中创建一个新文件来对系统中的任何用户尝试此操作时,它正确地继承了父组。当通过在 Apache 中运行的 PHP 创建新文件时,它始终具有 apache.apache 所有权。 Apache 似乎忽略了 setgid 位,我认为它无法做到这一点,因为这是由文件系统完成的。这是我上传的一个文件:

-rw-rw-r-- 1 apache apache 30536 Oct 10 14:43 209

我无法直接以 apache 用户身份进行测试,因为它没有指定登录 shell(出于明显的安全原因)。

我可以通过将 ftpusers 组添加到 apache 组来获得相同的权限,但从安全角度来看,这似乎并不明智。

我确实发现了一件似乎可能相关的事情 - php 安全模式,我已经验证它在 /etc/php.ini 中已关闭,尽管我不确定我找到了 mod_php 的 php.ini 文件在 apache 中使用。 php 脚本使用 move_uploaded_file();据我所知,在 php 代码中并没有对权限进行任何花哨的操作。

我最好的猜测是,这是对安全性的故意限制,但我找不到任何似乎表明是这种情况的东西。

使用 Apache 2.2.17 和 php 5.2.16 运行 CentOS 5.6。

有人知道吗?

【问题讨论】:

标签: php apache centos


【解决方案1】:

当您上传文件时,它会在 PHP 的“upload_tmp_dir”设置指定的目录中创建。然后 move_uploaded_file() 将其移动到您的目标目录。它维护在创建时赋予它的权限,而不是您将文件移动到的目标目录的权限。

所以您希望 tmp 目录拥有您想要的权限,基本上是您授予目标目录的权限。然后它会在 setgid 生效的情况下创建,并且移动会保留它们。

IIRC "upload_tmp_dir" 在 .htaccess 中不可用,因此如果您无法更改此设置或授予该目录的权限,那么您将需要以其他方式进行。

【讨论】:

  • 不,这没有帮助。我的 upload_tmp_dir 具有正确的 setgid(用户作为组),但上传的文件所有权仍然是 apache:apache
  • 有趣的答案,但对于我来说,php 7.0 和 FPM 都不起作用。
猜你喜欢
  • 2011-06-21
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2015-11-12
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多