如何强制PHP为文件上传设置正确的权限?

时间:2013-01-11 15:18:18

标签: php permissions apache2 freebsd patch

我的服务器有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中的哪个内部函数可以做到这一点?

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

再次,chmod()chown()只有两种方法,您可以通过它们更改权限和所有权,相当于通过{{1}发出shell命令}}。

答案 2 :(得分:0)

尝试查看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的用户。

答案 3 :(得分:0)

我找到了修复它的方法。那是我补丁的代码:

*** 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():第111行的/path/to/script.php中不允许操作”。如何压制这个警告 - 我不知道。