通过PHP / Apache编写的文件不支持目录setgid位

抓住这个,看起来很基本.

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

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

正如您所看到的那样,我已经在该目录上设置了setgid位,以便编写的任何文件都具有需要访问这些文件的用户(如FTP用户)才能修改/覆盖它们的组.我为Apache设置了umask,以便它将文件写为组可写.

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

-rw-rw-r– 1 apache apache 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.

有人有线索吗?

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

所以你希望tmp目录拥有你想要的权限,基本上你已经给你的目标目录.然后它将使用setgid创建有效,并且移动将保留它们.

IIRC“upload_tmp_dir”在.htaccess中不可用,因此如果您无法更改此设置或给予dir的权限,则需要以其他方式执行此操作.

点赞