共享主机上COMPOSER_HOME不安全,因多站点共用同一系统用户(如www-data),导致~/.composer路径全局共享,缓存、临时文件易被读取、覆盖或污染;必须显式设为项目级绝对路径(如$(pwd)/.composer)并配合COMPOSER_CACHE_DIR、自定义sys_temp_dir及严格权限控制。

Composer 在共享主机上运行时,临时文件(如 composer.phar 下载缓存、vendor/ 解压中间态、~/.composer/cache/)默认不隔离,极易被其他用户读取或覆盖,存在敏感信息泄露和执行冲突风险。必须显式配置隔离路径,且不能依赖系统级 ~/.composer。
为什么共享主机上的 COMPOSER_HOME 不安全
共享主机(如 cPanel、Plesk 或低价虚拟主机)通常允许多个用户共用同一 Linux 用户(如 www-data 或一个受限的 shareduser),但未做进程级或文件系统级隔离。此时:
-
~/.composer实际指向/home/shareduser/.composer,所有同用户站点共享该目录 -
composer install会把包解压临时文件写入/tmp,而/tmp通常是全局可读的 - 若两个项目同时运行
composer update,可能因缓存锁或并发写入导致失败或损坏 - 攻击者可通过遍历
/home/shareduser/.composer/cache/files/获取私有包源码或 API Token(如私有 Git 仓库凭证)
强制使用项目级 COMPOSER_HOME 目录
不要依赖默认路径。每次调用 composer 前,用环境变量限定其全部临时行为范围:
- 在项目根目录下创建
.composer子目录:mkdir -p .composer/cache - 执行命令时指定:
COMPOSER_HOME="$(pwd)/.composer" composer install - 若用
php composer.phar,同样生效:COMPOSER_HOME="$(pwd)/.composer" php composer.phar install - 为防遗漏,可在项目
.bashrc或部署脚本中设为默认:export COMPOSER_HOME="$(pwd)/.composer"(注意:仅对当前 shell 有效)
绕过系统 /tmp 的临时解压路径
Composer 在安装包时会先下载 ZIP/TAR 到系统 /tmp,再解压。共享主机上这步极危险。解决方案是用 COMPOSER_CACHE_DIR + 自定义 sys_get_temp_dir() 补丁:
- 设置缓存目录到项目内:
COMPOSER_CACHE_DIR="$(pwd)/.composer/cache" - 关键一步:在
composer.json中加"config": {"fxp-asset": {"tmp-dir": "tmp"}}(仅当使用fxp/composer-asset-plugin时) - 更通用的办法是重写 PHP 的临时目录:在运行前加
PHP_INI_SCAN_DIR="" php -d sys_temp_dir="$(pwd)/tmp" composer install,并确保$(pwd)/tmp已创建且权限为700 - 避免使用
opcache.enable_cli=1,它会让 Composer 缓存生成的 PHP 文件残留于全局 opcache,加剧跨项目污染
部署时禁用交互与清理残留
共享主机常限制后台进程和长连接,composer install 默认的进度条、交互式提示、信号处理都可能卡住或泄漏路径信息:
- 始终加
--no-interaction --no-progress --quiet参数,关闭所有输出和等待 - 加
--no-scripts防止执行post-install-cmd中可能调用的非隔离命令 - 部署后手动清理:
rm -rf $(pwd)/tmp $(pwd)/.composer/cache/*.zip(保留packages.json和repo/可加速下次) - 切勿将
.composer目录加入public/或 Web 可访问路径——哪怕加了.htaccess,也建议用chmod 700 .composer锁死
真正麻烦的不是配置本身,而是共享主机往往禁止修改 open_basedir、屏蔽 putenv()、甚至拦截 sys_get_temp_dir() 调用。这时候,COMPOSER_HOME 看似生效,实际仍 fallback 到 /tmp ——务必用 strace -e trace=openat php composer.phar install 2>&1 | grep tmp 验证真实写入路径。


















