【问题标题】:How to force PHP set correct permissions on files uploading?如何强制 PHP 设置正确的文件上传权限?
【发布时间】:2013-01-11 15:18:18
【问题描述】:

我的服务器装有 FreeBSD 8.0、Apache 2.2.23 和 PHP 5.4.10。那是我的 VirtualHost 配置:

<VirtualHost *>
    ServerName site.com
    ServerAlias www.site.com
    DocumentRoot /usr/home/site/pub/htdocs/
    php_admin_value open_basedir /usr/home/site/
    php_admin_value session.save_path 0;0660;/usr/home/site/pub/tmp/
    php_admin_value upload_tmp_dir /usr/home/site/pub/tmp/
</VirtualHost>

/usr/home/site/pub/tmp/ 由 site:www 拥有,具有 4770 权限。正确创建会话文件(660 和站点:www)。但上传的临时文件创建的权限为 600。因此,由于这个临时文件由 site:www 拥有,而 Apache 从 www:www 运行,move_uploaded_file() 无法移动文件。

如何解决?

我认为我需要修补 PHP 来强制设置此 tmp 文件的权限。但是哪里?而PHP中的哪个内部函数可以做到呢?

【问题讨论】:

  • 此功能无济于事,因为站点拥有的文件:www 600 和 Apache 从 www:www 运行。

标签: php permissions apache2 freebsd patch


【解决方案1】:

创建文件,然后设置权限即可。

chmod("/somedir/yourfile", 0644);

【讨论】:

  • 此功能无济于事,因为站点拥有的文件:www 600 和 Apache 从 www:www 运行。
【解决方案2】:

不要对那些告诉你使用chmod() 的人投反对票,因为这是唯一的解决方案 从 PHP 更改文件权限。但是,主要问题似乎是 Apache 正在创建具有与脚本运行时不同的 uid 的文件,[不太可能 AFAIK] 或者您正在尝试修改使用作为运行的不同进程创建的文件不同的用户。

只有文件的所有者才能更改文件的权限/所有权,除非专门运行单独的进程将所有权转移到另一个 uid,否则文件的所有者就是创建它的 uid。

再次重申,chmod()chown()仅有的两种方法,您可以通过它们更改权限和所有权,相当于通过exec() 发出shell 命令。

【讨论】:

  • 对不起,但这不是我的反对意见。你是对的。但会话文件创建正确。所以,PHP 可以设置权限强制。现在我想我必须修补 php_open_temporary_file.c。
【解决方案3】:

尝试查看chown,您可以临时更改文件的所有者,以便进行适当的更改:

$File = '/path/to/file';
chown($File, USERNAMEPHPISRUNNIGNAT);
chmod($File, 0644);
// Makes Appropriate changes To Files 
chown($File, originalowner);
// Changes your file back to it's original owner

想知道php运行的用户名是什么:

echo exec('whoami');

上面将返回运行php的用户。

【讨论】:

    【解决方案4】:

    我找到了解决方法。这是我的补丁代码:

    *** main/php_open_temporary_file.c.orig 2013-01-11 20:33:42.000000000 +0400
    --- main/php_open_temporary_file.c  2013-01-11 21:17:44.000000000 +0400
    ***************
    *** 101,113 ****
        char cwd[MAXPATHLEN];
        cwd_state new_state;
        int fd = -1;
    ! #ifndef HAVE_MKSTEMP
    !   int open_flags = O_CREAT | O_TRUNC | O_RDWR
    ! #ifdef PHP_WIN32
    !       | _O_BINARY
    ! #endif
    !       ;
    ! #endif
    
        if (!path || !path[0]) {
            return -1;
    --- 101,107 ----
        char cwd[MAXPATHLEN];
        cwd_state new_state;
        int fd = -1;
    !   int open_flags = O_CREAT | O_TRUNC | O_RDWR;
    
        if (!path || !path[0]) {
            return -1;
    ***************
    *** 144,169 ****
            return -1;
        }
    
    - #ifdef PHP_WIN32
    - 
    -   if (GetTempFileName(new_state.cwd, pfx, 0, opened_path)) {
    -       /* Some versions of windows set the temp file to be read-only,
    -        * which means that opening it will fail... */
    -       if (VCWD_CHMOD(opened_path, 0600)) {
    -           efree(opened_path);
    -           free(new_state.cwd);
    -           return -1;
    -       }
    -       fd = VCWD_OPEN_MODE(opened_path, open_flags, 0600);
    -   }
    - 
    - #elif defined(HAVE_MKSTEMP)
    -   fd = mkstemp(opened_path);
    - #else
        if (mktemp(opened_path)) {
    !       fd = VCWD_OPEN(opened_path, open_flags);
        }
    - #endif
    
        if (fd == -1 || !opened_path_p) {
            efree(opened_path);
    --- 138,146 ----
            return -1;
        }
    
        if (mktemp(opened_path)) {
    !       fd = VCWD_OPEN_MODE(opened_path, open_flags, 0660);
        }
    
        if (fd == -1 || !opened_path_p) {
            efree(opened_path);
    

    现在它工作正常,但显示警告“警告:move_uploaded_file(): Operation not allowed in /path/to/script.php on line 111”。如何抑制此警告 - 我不知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-08
      • 2014-10-23
      • 2011-02-20
      • 2013-11-30
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多