根本原因在于Web服务器配置不当:DocumentRoot若指向项目根目录,/vendor/天然可访问;正确做法是将DocumentRoot设为public/,并用Nginx的location ^~ /vendor/ { return 403; }或Apache的<Directory>禁止访问。

Vendor 目录被路径遍历攻击利用,根本不是 Composer 的责任,而是 Web 服务器暴露了它——防护必须落在 DocumentRoot 和 location / rewrite 规则上,不是靠 composer config 或 htaccess-protect。
为什么 vendor/autoload.php 能被直接访问就是高危入口
PHP 解析失败时会泄漏绝对路径(如 /var/www/myapp/vendor/autoload.php),攻击者可据此构造 ../../etc/passwd 类路径;更严重的是,某些旧版 Composer 自动加载器未初始化时会输出类映射数组,暴露项目结构和命名空间。这不是“可能”,是已验证的利用链。
- 所有能通过浏览器 GET 到
/vendor/autoload.php的站点,默认已具备路径遍历前置条件 - 即使你删了
.htaccess,只要DocumentRoot指向项目根目录(含vendor/),/vendor/就天然在 URL 地址空间内 - CI/CD 中执行
cp -r vendor public/是最隐蔽的破防操作——它让防护形同虚设
Nginx 下必须加的硬隔离规则
仅靠 index.php 入口路由无法阻止直接请求 /vendor/ 下任意文件,Nginx 必须显式拒绝。以下规则需放在 server 块内,且优先级高于 location /:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
location ^~ /vendor/ {
return 403;
}
location ~* \.(php|phar|env|lock|json|yml|yaml|xml|md)$ {
deny all;
}-
^~ /vendor/比正则匹配优先级更高,避免被后续location ~ \.php$拦截后误执行 - 第二条防止攻击者绕过
/vendor/直接请求/composer.json或/.env(常见于 DocumentRoot 设错但没禁/下敏感文件) - 别用
alias或root指向vendor/——这等于主动开门
Apache 下不能只靠 .htaccess 的真实原因
.htaccess 是否生效取决于虚拟主机配置中 AllowOverride 的值。若为 None(生产环境常见),.htaccess 文件完全被忽略,写再多 RewriteRule ^vendor/ - [F,L] 都无效。
- 必须确认
VirtualHost中有AllowOverride All或至少AllowOverride AuthConfig FileInfo - 更可靠的做法是把规则写进主配置:
<Directory "/var/www/myapp/vendor"> Require all denied </Directory> - 如果用了
mod_rewrite,错误日志里出现Invalid command 'RewriteRule',说明模块根本没启用——跟 Composer 无关
中文环境下特别容易踩的坑
中文路径、UTF-8 文件名、Windows 换行符都可能干扰 Web 服务器解析,但真正致命的是部署习惯:很多国内团队仍习惯把整个项目(含 vendor/、composer.json)扔进 Web 根目录,再靠 .htaccess 补救,这等于在门锁上贴张“禁止入内”的纸条。
- 不要在
composer.json里写"htaccess-protect": true——这个键名在 Composer 2.5–2.9 所有版本中都不存在,源码和 schema 里查不到 - 不要运行
composer config --global vendor-protect true——命令会成功,但什么都不会发生 - 检查
$_SERVER['DOCUMENT_ROOT']输出,确认它是否真的指向public/或web/,而不是项目根目录
最可靠的防护永远只有两条:Web 根目录不包含 vendor/,以及服务器配置显式拒绝所有对 /vendor/ 的访问。其他都是幻觉。

















