【问题标题】:How to setup minimum permissions to create files from PHP如何设置从 PHP 创建文件的最低权限
【发布时间】:2016-09-16 18:09:42
【问题描述】:

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

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

只有当我将 images 目录设置为具有 world write 权限时,这才能完美运行:

drwxrwxrwx 2 foo foogroup images

我的/etc/group 包含:

foogroup:5134:www-data

当我在网页上运行<?php echo exec('whoami'); ?> 时,我得到www-data。

那么为什么775(群写)权限不起作用?

【问题讨论】:

  • 暂时保留777的权限,并创建一个文件。它是在什么所有者和组下创建的?也尝试使用 www-data 而不是 foogroup 和 775 的权限。这会改变什么吗?
  • 如果我将组更改为www-data,这意味着与foogroup 类似的组的所有其他用户都可以访问这些文件。图片权限-rw-r--r-- 1 www-data www-data 130818 May 19 19:43 573e095cf2741.jpg
  • 我正在尝试 14.04LTS,但无法重现。您使用的是什么平台和版本?

标签: php linux ubuntu permissions


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    扩展我以前的 cmets:您的服务器正在与用户 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 等...?

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 2021-01-17
      • 2016-08-14
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多