composer 不支持 vendor 自动备份,所谓“备份”实为外部脚本在 install/update 前打包存档;生产环境应设 vendor 只读、ci 中用 --dry-run 校验一致性、grep 防 autoload.php 被篡改。

Composer 本身不支持 vendor 自动备份
它没有 backup、snapshot 或 --backup-vendor 这类命令,所有「自动备份」都是外部脚本或 CI 配置的模拟行为。你看到的所谓“备份”,本质是:在 install/update 前把当前 vendor 打包存档,再覆盖安装。这不能防篡改,只防误操作回滚。
- vendor 目录不是 Git 跟踪对象,也不在 composer.lock 校验链路里
-
composer install --dry-run可预演但不生成备份 - 任何“自动备份”逻辑必须自己写 shell 脚本或集成到 CI 的 pre-install 步骤中
部署前该做的是只读防护 + 快照比对,不是备份
真正有效的部署前检查,不是留个旧 vendor 等着 rollback,而是确认当前 vendor 和 lock 文件完全一致,并防止运行时被改写:
- 生产环境执行:
chmod -R a-w vendor/(注意:需确保 autoload_real.php 等文件仍可读) - CI 中加一步:
composer install --dry-run --verbose—— 它会逐个校验dist.sha256,失败即中断,且输出具体包名 - 快照比对推荐用
tar -cf - vendor/ | sha256sum(排除vendor/bin/和vendor/composer/installed.json),和上一次发布时的哈希比对 - 别依赖
vendor/autoload.php内容不变 —— 它不参与任何哈希校验,被注入eval($_GET['x'])也不会报错
为什么 audit / dump-autoload 都不能替代完整性检查
composer audit 查的是已知 CVE,不校验文件内容;composer dump-autoload 只重生成映射文件,完全不读 vendor/autoload.php。两者都绕不开一个事实:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
vendor/autoload.php是静态引导入口,内容固定为require_once __DIR__ . '/composer/autoload_real.php'; - 一旦这个文件被手动替换或注入,Composer 在 install、update、dump-autoload、audit 全流程中零感知
- 唯一能发现它的,是外部 grep:
grep -q "eval\|system\|shell_exec" vendor/autoload.php,或固定内容哈希比对
CI 中最简可行的安全检查链
不用复杂工具,三行命令就能堵住大部分漏洞入口:
-
composer install --prefer-dist --no-dev --optimize-autoloader(强制走 dist,跳过 source 风险) -
composer install --dry-run --verbose || exit 1(校验 lock 与当前 vendor 是否一致) -
grep -q "autoload_real\.php" vendor/autoload.php || exit 1(防基础文件替换)
这三个动作加起来不到两秒,但能挡住缓存污染、镜像劫持、手动篡改三类常见问题。真正的难点不在命令怎么写,而在于——你是否在每次部署前,真的执行了它们。










