sys_get_temp_dir dans l'environnement d'hébergement partagé

Remarque: Ce problème peut également s'adapter en super-utilisateur.

Je suis la configuration de PHP 5.3.10 sur un ordinateur hôte partagé avec apache2 mpm itk et open_basedir de manière à ce que chaque utilisateur ne peut pas voir ou modifier les fichiers d'un autre utilisateur. Dans le apache2 vhost réglages, j'ai ajouter les entrées appropriées pour restreindre l'utilisateur:

    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/

Maintenant, la première ligne définit les utilisateurs de linux à utiliser pour apache2, les trois lignes suivantes définissent les basedir, répertoire de téléchargement et de la session savepath être dans le répertoire de l'utilisateur. Je vais revenir à la dernière ligne en une seconde.

Maintenant pour le problème: sys_get_temp_dir() devrait redonner le répertoire temporaire pour php, qui est /tmp être par défaut sur un système linux. Pour des raisons de sécurité, ce répertoire doit résider dans le open_basedir de l'utilisateur. Selon le php-source de 5.3.10, le sys_get_temp_dir()-fonction utilise la variable d'environnement TMPDIR pour obtenir ce répertoire:

     //php-src/main/php_open_temporary_file.c:217-219
     /* On Unix use the (usual) TMPDIR environment variable. */
     {
             char* s = getenv("TMPDIR");

C'est ce que la cinquième ligne dans la configuration ci-dessus devrait faire. Cependant, sys_get_temp_dir() retourne simplement le système global directory, ignorant la variable d'environnement (ce qui est parfaitement défini dans la variable $_SERVER, également visible via phpinfo()).

Cette résultats dans quelques vilains bugs avec divers logiciels en s'appuyant sur sys_get_temp_dir(), que ce répertoire est à l'extérieur de la open_basedir réglage. J'ai essayé de définir la variable directement dans $_ENV et $_SERVER sans un changement de comportement. J'ai essayé un putenv('TMPDIR=/home/userA/www/tmp') sans changement.

Cependant, je suis en mesure de changer la sortie en définissant la variable dans /etc/apache2/envvars - ce qui est inutile pour moi, car je veux que chaque VHOST pour avoir son propre dossier temporaire.

La seule solution que j'ai trouvé pour l'instant est d'écraser l'intérieur sys_get_temp_dir() grâce à une extension comme runkit et l'application de son inclusion via auto_prepend_file. Mais cette solution est tellement sale, je ne peux pas le croire, qu'il n'y a pas de meilleure solution.

Donc, ma question: Est-il possible de modifier le résultat de sys_get_temp_dir() à être installé dans un apache2 vhost, sans réimplanter la fonction avec runkit?

Edit: La version d'apache est 2.2.22, et actuellement, je utiliser mod_php. Comme je vais devoir ajouter tous les utilisateurs manuellement, un fcgi ou similaire, installation serait également possible.

  • Qui Apache version utilisez-vous? 2.0? 2.2? 2.4?
  • Simplement être informé que open_basedir peut être très coûteux. J'ai vu des situations où les temps de chargement des pages d'un complexe CMS backend (TYPO3) a augmenté de 3 secondes >50 secondes en vertu de la directive open_basedir de protection.
InformationsquelleAutor Lars | 2012-11-01