composer本身不校验已安装包完整性,唯一能真正比对vendor/文件与composer.lock中dist.sha256是否一致的机制是实验性命令verify-checksums,需composer≥2.5且显式启用composer_experimental=1,并配合--strict参数确保失败时返回非零退出码。

Composer 本身不校验已安装包的文件完整性,所谓“依赖声明检查”和“完整性校验”是两回事:前者靠 composer validate 检结构,后者必须用 verify-checksums 或脚本比对哈希——但这个命令默认不可用,得手动开实验开关。
composer validate 能不能发现 vendor 被篡改?
不能。composer validate 只读 composer.json 和 composer.lock 两个文件,检查 JSON 格式、字段合法性、以及 lock 是否由当前 json 生成(通过 content-hash 字段比对)。它完全不访问 vendor/ 目录,也不计算任何文件哈希。
-
composer validate --lock仅验证 lock 文件是否与当前 json 兼容,不校验 dist.sha256 是否匹配磁盘内容 -
composer install --dry-run只模拟依赖解析,跳过下载和解压,根本不会触发哈希比对逻辑 - 即使
vendor/autoload.php被替换成eval($_GET['x']),validate也完全无感
verify-checksums 是什么?为什么总提示 command not found?
verify-checksums 是 Composer 2.5+ 引入的实验性命令,唯一目的就是比对 composer.lock 中每个包的 dist.sha256 和当前 vendor/{package} 目录的实际哈希值。但它默认被禁用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须设置环境变量:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums - 低于 2.5 版本没有该命令,先运行
composer --version,再composer self-update - 不加
--strict参数时,校验失败只 warn 并返回 0 状态码,CI 会误判为成功 - 它只校验 dist 类型包(即 zip/tar 解压后的目录),source 安装(
--prefer-source、path仓库)直接跳过
为什么 verify-checksums 报错后不能简单忽略?
报 Checksum mismatch 不代表配置错了,而是明确告诉你:vendor/ 里的文件和 composer.lock 承诺的不一致。可能原因很具体:
- 你用了国内镜像源,但该镜像返回的 dist 包和 Packagist 官方不一致(比如打了补丁却没更新 sha256)
- 本地缓存被污染,
~/.composer/cache/files/下的 zip 被手动修改过 -
composer.lock被人工编辑过,删了某个包的dist.sha256字段,或改错了值 - 部署时复用了旧 vendor(比如 Docker 多阶段构建中 builder 阶段生成 vendor,运行阶段又覆盖了权限或内容)
生产部署脚本里怎么安全集成 verify-checksums?
不能只在 composer install 后加一行就完事。关键点在于环境变量继承、退出码控制和执行时机:
- CI 中推荐写法:
COMPOSER_EXPERIMENTAL=1 composer install --no-interaction --no-plugins && COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict - 必须用
&&连接,确保前一步失败时后一步不执行;--strict保证校验失败时返回非零退出码 - 避免分两行写环境变量,bash 不跨行继承:
COMPOSER_EXPERIMENTAL=1和composer verify-checksums必须在同一行或用env显式传入 - 不要在
composer install时加--no-scripts或--no-plugins,某些插件会影响verify-checksums的路径识别逻辑
真正容易被忽略的是:verify-checksums 不校验 vendor/autoload.php 本身,也不管 vendor/composer/autoload_real.php 是否被注入。它只比对 lock 中声明的 dist 哈希与对应包目录内容。所以即便它通过了,仍需额外防护,比如把 vendor/ 设为只读,或 CI 中加 grep -q "autoload_real\.php" vendor/autoload.php 断言入口文件未被替换。










