2011-10-10 69 views
4

抓住这一点,我的头似乎很基础。通过PHP/Apache编写的文件不尊重目录setgid位

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

drwxrwsr-X 4 WWW ftpusers中4096 10月10日14:47附件

正如你可以看到我已经得到了setgid位上DIR设置,以便将写入任何文件都会有一群用户(如FTP用户)谁需要访问这些文件将能够修改/覆盖它们。我已经为Apache设置了umask,以便将文件写入群组可写。

当我尝试这与创建在该目录中的新文件系统中的任何用户,它正确地继承了集团母公司。当通过在Apache中运行的PHP创建新文件时,它始终拥有apache.apache所有权。 Apache似乎忽略了setgid位,我认为它不能完成,因为这是由文件系统完成的。下面是一个文件I上传:

-rw-RW-R-- 1阿帕奇阿帕奇30536 10月10日14时43分209

我无法测试作为apache用户直接,因为它不具有登录shell指定(出于明显的安全原因)。

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

我确实发现了一件似乎可能与之相关的东西 - 我已经验证的php安全模式已关闭/etc/php.ini,虽然我不积极,但我发现了php.ini文件Apache中的mod_php正在使用。 php脚本使用move_uploaded_file();据我所知,没有什么花哨的权限是在PHP代码中完成的。

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

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

任何人都有线索?

+0

之前问过那个问题,建议是使用move_uploaded_file()手动复制文件。请参阅http://stackoverflow.com/questions/6232759/phps-move-uploaded-file-does-not-respect-setgid –

回答

2

当您上传它由PHP的“upload_tmp_dir”设置中指定的目录中创建的文件。然后move_uploaded_file()将它移动到你的目标目录。它在创建时保留给它的权限,而不是你将文件移动到的目标目录的权限。

所以,你要的TMP目录有你想要的权限,基本上那些你已经给你的目标目录。然后它将会在setgid有效的情况下创建,并且移动会保留它们。

IIRC“upload_tmp_dir”是不是在.htaccess可用,因此,如果您不能更改此设置或给予目录,那么你将需要做的是另一种方式的权限。

+0

不,这没有帮助。我的upload_tmp_dir有正确的setgid(用户作为组),但上传的文件所有权仍然是apache:apache – wlf

+0

有趣的答案,但在php 7.0和FPM都不适用于我。 –