常见原因是插件未发布到Packagist或私有仓库未配置认证;需确认真实包名如paragonie/sodium_compat,用composer require安装;启用sigstore签名验证需composer config --global sigstore.enabled true;vendor目录须禁止Web访问以防泄露。

composer install 加密相关插件时提示 “package not found”
常见原因是插件未发布到 Packagist 官方源,或使用了私有仓库但没配置认证。比如想装 ext-sodium 对应的 PHP 扩展封装库 paragonie/sodium_compat,但误搜成 sodium 或 php-sodium 就会失败。
- 先确认真实包名:查官方文档或 GitHub 仓库主页,
paragonie/sodium_compat是纯 PHP 实现,ext-sodium是 C 扩展(不走 Composer 安装) - 运行
composer require paragonie/sodium_compat,不是composer install—— 后者只读composer.lock,不拉新包 - 如果公司用私有 Packagist(如 Satis 或 Private Packagist),需提前在
composer.json的repositories字段加源,并配置auth.json
如何让 composer 自动校验包签名防止供应链投毒
Composer 从 2.5 开始支持 sigstore 签名验证,但默认关闭。不开它,哪怕包被篡改、镜像被污染,composer install 仍会静默通过。
- 启用方式:执行
composer config --global sigstore.enabled true - 签名只对 Packagist 官方托管的包生效;私有包需自行生成并上传
.sigstore.json - 若某包无签名,Composer 默认跳过校验——想强制拦截,得加
--strict-sigstore参数,但会导致大量老包无法安装 - 注意:PHP 8.1+ 才完整支持 Sigstore 验证逻辑,低版本会降级为警告
vendor/autoload.php 被意外暴露导致类名泄露
Web 服务器配置不当(如 Nginx 未禁用 /vendor/ 目录访问)时,直接请求 https://yoursite.com/vendor/autoload.php 可能返回 200 并输出空白页,但实际已触发 autoloader 初始化,部分框架会在此阶段抛出异常并泄露路径或类名。
- 最简防护:Nginx 中加
location /vendor/ { return 403; };Apache 则确保.htaccess在 vendor 内生效 - 不要依赖
composer dump-autoload --optimize来“隐藏”类——它只影响加载性能,不改变文件可访问性 - 敏感环境建议把
vendor/移出 Web 根目录,用COMPOSER_VENDOR_DIR环境变量重定向
require-dev 里的安全工具(如 phpstan、roave/security-advisories)影响线上部署
roave/security-advisories 这类元包会强制锁死所有已知漏洞版本,但它属于 require-dev,上线时若用 composer install --no-dev,它就不起作用,等于白配。
- 真正起作用的方式是把它放在
require下——虽然名字带 “dev”,但它本质是约束性包,不是运行时依赖 - 但要注意:它和
phpstan不同,后者必须放require-dev,否则会拖慢生产环境启动 - CI 流程里建议分两步:先
composer install --no-dev跑服务,再composer install全量跑扫描,避免误把 dev 工具打进镜像










