【发布时间】: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。
有人知道吗?
【问题讨论】:
-
之前有人问过这个问题,建议是手动复制文件,而不是使用 move_uploaded_file()。见stackoverflow.com/questions/6232759/…