Примечание. Это может также соответствовать суперпользователю.
Я устанавливаю PHP 5.3.10 на общий хост с apache2 mpm itk и open_basedir таким образом, что каждый пользователь может не видеть или изменять файлы другого пользователя. В настройках vhost apache2 я добавляю соответствующие записи, чтобы ограничить пользователя:
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, следующие три строки определяют каталог, загружающий файлы, и каталог сохранения сеанса, которые будут находиться в каталоге пользователя. Я вернусь к последней строке за секунду.
Теперь для проблемы: sys_get_temp_dir()
должен вернуть временный каталог для php, который /tmp будет использоваться по умолчанию в системе linux. По соображениям безопасности этот каталог должен находиться в open_basedir пользователя. Согласно php-источнику 5.3.10, функция sys_get_temp_dir()
использует переменную среды TMPDIR для получения этой директории:
// php-src/main/php_open_temporary_file.c:217-219
/* On Unix use the (usual) TMPDIR environment variable. */
{
char* s = getenv("TMPDIR");
Это то, что должна сделать пятая строка в приведенной выше конфигурации. Однако sys_get_temp_dir()
просто возвращает глобальный системный каталог, игнорируя переменную окружения (которая отлично установлена в $_SERVER, также просматривается через phpinfo()
).
Это приводит к некоторым неприятным ошибкам с различным программным обеспечением, основанным на sys_get_temp_dir()
, поскольку этот каталог находится за пределами параметра open_basedir
. Я попытался установить переменную непосредственно в $_ENV и $_SERVER без изменения поведения. Я пробовал putenv('TMPDIR=/home/userA/www/tmp')
без изменений.
Однако я могу изменить вывод, указав переменную в /etc/apache 2/envvars - это бесполезно для меня, поскольку я хочу, чтобы каждый VHOST имел свою временную папку.
Единственное решение, которое я нашел до сих пор, - это переписать внутренний sys_get_temp_dir()
через расширение, например runkit, и обеспечить его включение через auto_prepend_file. Но это решение настолько грязно, я просто не могу поверить, что нет лучшего решения.
Итак, мой вопрос: есть ли способ изменить результат sys_get_temp_dir()
, который должен быть установлен в настройке vache apache2, без переопределения функции с помощью runkit?
Изменить: Версия Apache 2.2.22, и в настоящее время я использую mod_php. Поскольку мне придется добавлять всех пользователей вручную, возможно, также будет возможна настройка fcgi или аналогичная.