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


How to setup minimum permissions to create files from PHP

我正在使用PHP从上传的图像创建一个文件,如下所示:

$in = imagecreatefromjpeg($tempFile);
imagejpeg($in, "images/", 100);

只有当我将images目录设置为具有世界写入权限时,这才能完美工作:

drwxrwxrwx 2 foo foogroup images

我的/etc/group包含:

foogroup:5134:www-data

当我在网页上运行CCD_ 3时,我得到CCD_。

那么,为什么775组写入)权限不起作用呢?

扩展我之前的评论:您的服务器运行的是用户www-data和组www-data。我们知道这一点,因为当创建文件时,它属于该用户和组。

根据权限,在Unix中,这意味着如果目录由包含www-data的组所有,并且该目录是组可写的,则组www-data的任何用户都可以写入该目录。

现在我们更改的权限

775    www-data   foogroup

775    www-data   www-data

我们可能有两种情况:它起作用,或者不起作用。

如果它不起作用,那么我们可以清楚地证明,重要的不是组,而是用户。因此,就我们的意图和目的而言,它必须是与www-datafoogroup不同的东西。

如果有效,则可能意味着仅仅属于该组是不够的-似乎实际执行的检查更像是该组的完全匹配

我怀疑的是,你的设置与我的不同(我相信,Ubuntu 14.04-LTS的股票,在Apache下有mod_php5),而且你有一些"安全功能",它补充了Unix文件系统权限检查,在某些情况下,它本质上取代了Unix文件系统权限检查然后如果此测试通过,操作将像用户www-data一样正常执行。

因此,您可以运行的另一个测试是,使用当前的非工作权限和工作的777权限,执行

shell_exec("touch images/test.jpg 2>&1");

输出可能会产生一些有用的信息。例如,我们可能会发现shell实际上是由另一个用户运行的(775不起作用,777起作用,但现在该文件归其他人所有),或者PHP无法创建的文件是由同一PHP调用的shell创建的(这将最终证明PHP内部存在某种限制)。

其他有用的信息:你正在运行FastCGI,CGI,Apache模块,nginx,其他。。。?

如果您正在使用apache,请在httpd.conf文件中检查apache正在使用的用户和组。我通过将apache运行的用户设置为目录的所有者来解决类似的问题。