0

我有带有 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

4 回答 4

0

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

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

再一次,chmod()chown()唯一可以更改权限和所有权的两种方法,相当于通过exec().

于 2013-01-11T16:11:50.467 回答
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 中不允许操作”。如何抑制这个警告 - 我不知道。

于 2013-01-11T20:05:25.963 回答
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 的用户。

于 2013-01-11T16:16:46.523 回答
0

创建文件,然后设置权限将起作用。

chmod("/somedir/yourfile", 0644);
于 2013-01-11T15:24:18.263 回答