注意:这也适用于超级用户。共享主机环境中的sys_get_temp_dir
我使用apache2 mpm itk和open_basedir以某种方式在共享主机上设置PHP 5.3.10,即每个用户可能不会看到或更改其他用户的文件。在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的,接下来的三个行定义BASEDIR,上传目录和会话savepath在用户目录中。我会在一秒内回到最后一行。
现在的问题:sys_get_temp_dir()
应该返回临时目录为PHP,这是/ tmp默认在Linux系统上。出于安全原因,这个目录应该驻留在userA的open_basedir中。据5.3.10的PHP代码中,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()
查看)。
由于该目录不在open_basedir
设置的范围内,因此会导致一些依赖于sys_get_temp_dir()
的各种软件出现一些令人讨厌的错误。我试图将变量直接设置为$ _ENV和$ _SERVER,而不会改变行为。我已经尝试了putenv('TMPDIR=/home/userA/www/tmp')
而没有改变。
但是,我可以通过将变量定义到/ etc/apache2/envvars来改变输出 - 这对我来说是无用的,因为我希望每个VHOST都有它自己的临时文件夹。
我发现迄今是通过扩展覆盖内部sys_get_temp_dir()
等runkit和经由auto_prepend_file执行其包含唯一的解决办法。但是这个解决方案太脏了,我简直不敢相信,没有更好的解决方案。
所以,我的问题:有没有办法改变sys_get_temp_dir()
的结果设置在apache2虚拟主机设置,而不用runkit重新实现该功能?
编辑: apache版本是2.2.22,我目前使用mod_php。由于我将不得不手动添加所有用户,因此也可以使用fcgi或类似的设置。
您正在使用哪个Apache版本? 2.0? 2.2? 2.4? – hakre
只是被告知''open_basedir''可能会非常昂贵。我已经看到在open_basedir保护下,复杂CMS后端(TYPO3)的页面加载时间从3秒增加到> 50秒的情况。 – Jpsy