vendor目录不能设777,因任何用户(含被攻陷的web进程)均可篡改autoload.php或bin脚本注入后门;应设umask 0022并安装后执行find -type f -exec chmod 644 {} \;、find -type d -exec chmod 755 {} \;及chmod 755 vendor/bin/*。

Composer 本身不设置包文件权限,所有权限由系统层决定——你运行命令时的用户、umask、目录归属和后续是否手动加固,共同决定了 vendor/ 里每个 PHP 文件是 644 还是 666,目录是 755 还是 777。
为什么 vendor 目录不能 chmod -R 777
777 意味着任何能登录系统的用户(包括被攻陷的 Web 进程)都能修改 vendor/autoload.php 或第三方包里的 bin/ 脚本。真实入侵案例中,攻击者正是靠篡改这些文件注入后门。即使你没开 shell,PHP 的 eval()、include 或反序列化漏洞也能绕过执行限制。
-
vendor/下的 PHP 文件只需可读(644),不需要可写 - 目录需可执行(755)才能
require子目录中的类 -
vendor/bin/里的脚本需要可执行(755),但绝不能可写 - 若用
composer install --no-dev,确认vendor/composer/installed.json是 644,不是 666
如何让 vendor 权限“刚装完就安全”
靠 umask + 安装后修复两步走。只做其中一步,大概率留坑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 安装前设
umask 0022:新建文件默认 644,目录默认 755 - Docker 部署时,在
Dockerfile中写RUN umask 0022 && composer install --no-dev --optimize-autoloader - CI 脚本避免
sudo composer install,改用非特权用户 +umask 0022 - 安装完成后立即运行:
find vendor/ -type f -exec chmod 644 {} \;find vendor/ -type d -exec chmod 755 {} \;chmod 755 vendor/bin/*
Web 服务器读不了 vendor 怎么办
不是放宽权限,而是对齐用户组。PHP-FPM 以 www-data 运行,而你用 deploy 用户部署,两者不同属一个组,644 就读不了。
- 把 Web 用户加进部署用户组:
sudo usermod -a -G deploy www-data - 再给
vendor/加组读权限:chmod -R g+rX vendor/(X表示仅对目录或已有执行位的文件加 x) - 验证:
sudo -u www-data php -r "require 'vendor/autoload.php';" - 绝对不要
chmod -R 775 vendor/—— 组内任意成员都能改代码
post-install-cmd 自动修权限靠谱吗
只适合 storage/、bootstrap/cache/ 这类应用运行时必须可写的目录,不适合 vendor/。因为 post-install-cmd 是在 Composer 完成下载和 autoload 生成后才执行,此时 vendor/ 文件已经按当前 umask 写入,再 chmod 只是补救,且容易漏掉 vendor/bin/ 或 symlink。
- 可用于 Laravel:
"@php -r \"mkdir('storage', 0775, true);\""+"chmod -R 775 storage bootstrap/cache" - 但生产环境应更严:
chmod 755 storage storage/logs storage/framework+chmod 644 storage/*.log -
vendor/的权限必须在安装过程早期(umask)和后期(find + chmod)双控,不能依赖脚本兜底
真正难的不是命令怎么写,而是判断哪些目录该由谁写、哪些只需读——比如 storage/logs 必须可写,但 storage/app/.gitkeep 不该有写权限;vendor/ 对 CLI 是可写,对 Web 是只读,这个边界一旦模糊,加固就变成掩耳盗铃。










