vendor目录绝不能设777或664,因组可写权限使攻击者能篡改autoload.php等核心文件;正确做法是umask 0022后install,再手动chmod 644文件、755目录、755 vendor/bin/*,并确保www-data属deploy组。

vendor 目录绝不能设为 777,否则 PHP 文件、autoload 映射、bin 脚本全部可写,攻击者可通过任意代码执行漏洞直接篡改核心逻辑。
为什么 vendor/ 下的 PHP 文件被设成 664 就危险?
因为 664 表示“组内用户可写”,而很多部署环境(尤其是 CI 或 Docker)默认以 root 或高权限用户运行 composer install,导致生成的 vendor/autoload.php、vendor/composer/ClassLoader.php 等关键文件归属 root:root 且权限为 664。一旦 Web 服务器(如 www-data)被加入该组,或攻击者提权到同组用户,就能覆盖这些文件——这不是假设,是真实入侵链路的起点。
- 检查当前 umask:运行
umask,若输出0002,新建文件即为 664(不安全) - 临时修复:执行前加
umask 0022,让新建文件默认为 644、目录为 755 - Dockerfile 中必须显式声明:
RUN umask 0022 && composer install --no-dev --optimize-autoloader - CI 脚本禁用
sudo composer install,改用非特权用户 + 固定 umask
post-install-cmd 自动修权为何常失效?
很多人在 composer.json 的 "post-install-cmd" 里写 chmod -R 755 vendor/,但这个命令只对当前用户有效;如果之前已用 root 执行过 install,chmod 会失败(Permission denied),且 Composer 不报错、静默跳过。更糟的是,某些包自带的 post-install-cmd(比如 Laravel 的 php artisan storage:link)会在 vendor 外创建可写 symlink,绕过你的 chmod。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不要依赖 post-install-cmd 一次性修权,它无法覆盖 root 创建的文件
- 安装后必须手动加固:
find vendor/ -type f -exec chmod 644 {} \;和find vendor/ -type d -exec chmod 755 {} \; - 单独处理
vendor/bin/:chmod 755 vendor/bin/*(脚本需可执行,但不可写) - 确认
vendor/composer/installed.json是 644,不是 666(常见于 --no-dev 漏掉时)
Web 服务器读取 vendor 需要什么权限?
只要 PHP-FPM 或 Apache 以 web 用户(如 www-data)身份运行,且 vendor/ 所属用户与 web 用户同组,644/755 就足够。强行加组写权限(如 775)等于开放后门——组内任意成员都能改代码。
- 正确做法:把 web 用户加入部署用户组,例如
sudo usermod -a -G deploy www-data - 再设组读权限:
chmod -R g+rX vendor/(X表示仅对目录和已有执行位的文件加 x) - 绝对禁止:
chmod -R 775 vendor/或chown -R www-data:www-data vendor/(后者会让 CLI 失去写权限) - 额外防护:禁用 PHP 的
allow_url_include和auto_prepend_file,防止绕过文件权限加载恶意内容
真正容易被忽略的点是:哪怕 umask 设对了、chmod 跑完了,某些第三方包的 post-install 脚本仍可能在 vendor/ 外创建可写路径(比如 storage/logs),而这些路径不在 vendor 权限修复范围内——它们得单独管。










