注:これはスーパーユーザーにも当てはまる可能性があります。
各ユーザーが別のユーザーのファイルを表示したり変更したりできないように、apache2mpmitkとopen_basedirを使用して共有ホストにPHP5.3.10をセットアップしています。apache2 vhost設定で、ユーザーを制限するための適切なエントリを追加します。
AssignUserId userA userA
php_admin_value open_basedir /home/userA/www/
php_admin_value upload_tmp_dir /home/userA/www/tmp/
php_admin_value session.save_path /home/userA/www/tmp/
SetEnv TMPDIR /home/userA/www/tmp/
ここで、最初の行はLinuxユーザーがapache2に使用するように設定し、次の3行は、basedir、アップロードディレクトリ、およびセッションの保存パスがユーザーディレクトリにあることを定義します。すぐに最後の行に戻ります。
ここで問題が発生しますsys_get_temp_dir()
。phpの一時ディレクトリを返す必要があります。これは、Linuxシステムではデフォルトで/tmpです。セキュリティ上の理由から、このディレクトリはuserAのopen_basedirに存在する必要があります。5.3.10のphp-sourceによると、sys_get_temp_dir()
-functionは環境変数TMPDIRを使用してこのディレクトリを取得します。
// php-src/main/php_open_temporary_file.c:217-219
/* On Unix use the (usual) TMPDIR environment variable. */
{
char* s = getenv("TMPDIR");
これは、上記の構成の5行目が実行する必要があることです。ただし、sys_get_temp_dir()
環境変数($ _SERVERで完全に設定され、からも表示可能phpinfo()
)を無視して、グローバルシステムディレクトリを返すだけです。
sys_get_temp_dir()
そのディレクトリは設定の外にあるため、これにより、に依存するさまざまなソフトウェアでいくつかの厄介なバグが発生しopen_basedir
ます。動作を変更せずに、変数を$_ENVと$_SERVERに直接設定しようとしました。私はputenv('TMPDIR=/home/userA/www/tmp')
変更なしで試しました。
ただし、変数を/ etc / apache2 / envvarsに定義することで出力を変更できます。これは、各VHOSTに独自の一時フォルダーを持たせたいので、私には役に立ちません。
私がこれまでに見つけた唯一の解決策は、runkitsys_get_temp_dir()
のような拡張機能を介して内部を上書きし、 auto_prepend_fileを介してその包含を強制することです。しかし、その解決策は非常に汚いので、私は信じられません。これ以上の解決策はありません。
だから、私の質問:sys_get_temp_dir()
runkitで関数を再実装せずに、apache2 vhost設定で設定される結果を変更する方法はありますか?
編集: Apacheのバージョンは2.2.22で、現在mod_phpを使用しています。すべてのユーザーを手動で追加する必要があるため、fcgiまたは同様のセットアップも可能です。