composer config --global repo.packagist false 无效,因 composer 2.0+ 仅接受 null、对象或删除该键,false 被静默忽略并回退至 https://packagist.org;审计要求实测请求不触达外网,且需配合清缓存、删环境变量及项目级 "packagist": false 硬开关。

composer config --global repo.packagist false 为什么在审计中不被认可
它根本没禁用成功,只是往配置里塞了个无效值 false。Composer 2.0+ 对 repo.packagist 这个键只接受 null、对象或完全删除,false 会被静默忽略,然后 fallback 到内置的 https://packagist.org——你看到的 composer config -g repo.packagist 输出 false,不代表网络请求真的停了。
审计时抓包或看 composer install -v 日志,只要出现 Downloading https://repo.packagist.org/packages.json,就说明这条命令没起作用,属于配置失效项。
-
composer config --global repo.packagist null才是合法覆盖 -
composer config --global --unset repo.packagist是更干净的删除方式 - 执行后必须跟
composer clear-cache,否则旧缓存仍可能触发外网请求 - 验证是否生效:运行
composer config -g repo.packagist应无输出或返回null,再跑composer install -v确认不再出现repo.packagist.org
内网环境必须同时满足的两个配置层
安全审计不只看“有没有禁用”,而看“是否双重锁定”。全局禁用只是第一步,项目级必须显式声明 "packagist": false(注意不是 packagist.org),且必须放在 composer.json 顶层,不能塞进 repositories 数组里。
原因很直接:全局配置可被环境变量 COMPOSER_REPO_PACKAGIST 覆盖,CI 构建机或不同用户环境可能绕过;只有项目级 "packagist": false 是硬开关,强制 Composer 放弃所有 packagist 行为。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 错误写法:
"repositories": [{"packagist.org": false}]—— 这个条目被忽略,packagist.org依然隐式加载 - 正确写法:在
composer.json根层级加一行"packagist": false,大小写敏感,不能拼错 - 验证方式:
composer install --no-install查日志,确认元数据请求 URL 只指向你的私有源,绝无packagist.org
审计现场最容易漏掉的三个检查点
很多团队配完自以为搞定,结果审计一查就失败,问题往往不在命令本身,而在配套动作缺失。
- 没清缓存:
composer clear-cache必须执行,否则 Composer 会从本地缓存读取旧的packages.json,甚至偷偷回源校验 - 没删环境变量:
env | grep COMPOSER_REPO_PACKAGIST必须为空,这个变量优先级高于全局配置,CI 中常被误设 - 没验证实际行为:光看
composer config -g -l | grep repo不够,得实测composer install -v或抓包,确认 DNS 请求和 HTTP 连接都未触达外网
私有源配置必须带 type 字段才通过审计
只写 composer config --global repos.my-satis https://intra.example.com 是不够的。审计要求明确声明源类型,否则 Composer 默认按 composer 类型处理,但某些镜像服务(如 Satis)需显式指定 "type": "composer" 才能正确解析 packages.json 结构。
更关键的是:如果漏掉 type,Composer 可能降级为 package 模式,导致依赖解析失败或跳过版本约束校验——这在审计中属于“来源不可控”风险项。
- 正确示例:
composer config --global repos.my-satis '{"type": "composer", "url": "https://intra.example.com"}' - 错误示例:
composer config --global repos.my-satis https://intra.example.com(缺 type,不被审计认可) - 验证方式:
cat ~/.composer/config.json查看是否生成了完整 JSON 对象,而非字符串值
hosts 文件加 127.0.0.1 packagist.org 后跑一遍 composer install -v,看到 Connection refused 才算过关——其他全是纸面合规。










