我正在使用PHP从上传的图像中创建一个文件,如下所示:
$in = imagecreatefromjpeg($tempFile);
imagejpeg($in, "images/", 100);
仅当我将images
目录设置为具有全球写入权限时,此功能才能正常运行:
drwxrwxrwx 2 foo foogroup images
我的/etc/group
包含:
foogroup:5134:www-data
当我在网页上运行<?php echo exec('whoami'); ?>
时,我得到www-data
。
那么为什么775
(群组写)权限不起作用?
答案 0 :(得分:0)
如果您使用的是apache,请在httpd.conf文件中查看用户和组apache正在使用的内容。我通过将用户apache运行设置为目录的所有者修复了类似的问题。
答案 1 :(得分:0)
要扩展我以前的评论:您的服务器正在与用户www-data
和群组www-data
一起投放。我们知道这一点,因为在创建文件时,它属于该用户和组。
通过权限,在Unix中,这意味着如果目录由包含www-data
的组拥有,并且该目录是组可写的,则该目录可以由组www-data
的任何用户编写
现在我们从
更改权限775 www-data foogroup
到
775 www-data www-data
我们可能有两种情况:它有效,或者没有。
如果它不起作用,那么我们清楚地证明了重要的不是群体 - 它必须是用户。因此,我们的意图和目的必须与www-data
和 foogroup
中的不同。
如果它有效,可能意味着只是属于到该组是不够的 - 似乎实际执行的检查更多是完全匹配小组。
我怀疑的是你的设置与我的设置不同(我相信,Ubuntu 14.04-LTS,在Apache下有mod_php5
),并且你有一些补充的“安全功能”,并且在某些情况下实质上取代了Unix文件系统权限检查,并对其自身进行了一些更严格的检查。 然后如果此测试通过,操作将照常用户www-data
执行。
因此,您可以运行的另一个测试是,使用当前的非工作权限和工作777权限,执行
shell_exec("touch images/test.jpg 2>&1");
输出可能会产生一些有用的信息。例如,我们可能会发现shell实际上是由另一个用户运行的(775不起作用,777不起作用,但现在该文件由其他人拥有),或者PHP无法创建的文件 从同一个PHP调用的shell创建(这将最终证明在PHP中实现某种约束)。
其他有用信息:您运行的是FastCGI,CGI,Apache模块,nginx,其他......?