如何设置从PHP创建文件的最小权限

时间:2016-05-19 17:36:55

标签: php linux ubuntu permissions

我正在使用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群组写)权限不起作用?

2 个答案:

答案 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,其他......?