0

FreeBSD 8.0、Apache 2.2.23、PHP5.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およびsite:www)。ただし、600の権限で作成する一時ファイルをアップロードしました。したがって、site:wwwおよびwww:wwwから実行されているApacheが所有するこの一時ファイルは、move_uploaded_file()がファイルを移動できないためです。

それを修正する方法は?

このtmpファイルの強制設定権限にはパッチPHPが必要だと思います。しかしここで?そして、PHPのどの内部関数がそれを行うことができますか?

4

4 に答える 4

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

PHPからファイルのパーミッションを変更する唯一の解決策chmod()であるため、使用するように指示している人に反対票を投じないでください。ただし、主な問題は、Apacheがスクリプトの実行時とは異なるuidでファイルを作成しているか、[おそらくAFAIKではない]、またはとして実行されている別のプロセスを使用して作成されたファイルを変更しようとしていることです。別のユーザー。

ファイルの所有者のみがファイルの権限/所有権を変更できます。所有権を別のuidに譲渡するために特別に別のプロセスが実行されない限り、ファイルの所有者はファイルを作成したuidです。

繰り返しにchmod()なりchown()ますが、権限と所有権を変更できる唯一の2つの方法exec()であり、を介してシェルコマンドを発行するのと同じです。

于 2013-01-11T16:11:50.467 に答える
0

ファイルを作成してから、権限を設定すると機能します。

chmod("/somedir/yourfile", 0644);
于 2013-01-11T15:24:18.263 に答える
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 に答える