COMPOSER_DISABLE_NETWORK=1 是硬性安全开关,强制阻断所有 HTTP 客户端调用,不设它则即使加 --no-plugins 也会在解析 composer.json 阶段请求 packagist 元数据,暴露内网风险。

离线配置本身不提升安全等级,但能切断 Composer 主动外连行为,是内网隔离防护中“收口网络出口”的关键一环。
为什么 COMPOSER_DISABLE_NETWORK=1 是硬性安全开关
这个环境变量不是“建议开启”,而是强制阻断所有 HTTP 客户端调用。不设它,composer install 即使加了 --no-plugins 也会在解析 composer.json 阶段尝试请求 https://repo.packagist.org/packages.json——这不是 bug,是 Composer 的默认元数据校验机制。一旦目标机器意外连通外网(比如运维误开代理、容器桥接错配),这个请求就会真实发出,暴露内网结构或触发审计告警。
-
COMPOSER_DISABLE_NETWORK=1会让所有远程 URL 解析直接报错退出,不重试、不 fallback - 它比
composer config --global repo.packagist false更底层:后者只禁用 packagist 源,但若项目composer.json里写了其他公网仓库(如"url": "https://api.github.com"),仍可能触发请求 - 必须在运行命令前导出,写进 Dockerfile 时要用
ENV COMPOSER_DISABLE_NETWORK=1,不能靠 shell 启动时临时 set
全局 config repo.packagist false 为什么还不够
这个配置只影响源列表的读取逻辑,不阻止 Composer 内部对包版本、签名、dist URL 的远程验证。你执行 composer config --list 看到 repo.packagist 为空,不代表安全。常见漏点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目级
composer.json中的repositories字段仍含公网地址,会覆盖全局设置 - 某些插件(如
phpstan/extension-installer)会在--no-plugins外自行发起 HTTP 请求 -
composer.lock里若存在"source": {"type": "git", "url": "https://github.com/..."},离线时install会直接失败,但失败前已尝试解析该 URL
离线镜像打包时最容易被忽略的污染点
很多人在联网机上构建完 vendor 目录就直接拷进内网,却没清理缓存和临时文件,导致镜像里残留了可被复用的远程元数据:
-
composer clear-cache必须在打包前执行,否则~/.composer/cache下的repo.packagist.org缓存可能被复用 - 构建用的
composer.json若含"minimum-stability": "dev",会拉取 dev 分支的 Git 信息,这些信息里常带原始仓库 URL - Docker 构建时若用了
COPY . /app,而本地.git目录未忽略,vendor/中部分包的installed.json可能记录了原始 Git 地址
真正安全的离线配置,不是“不让它连”,而是“让它连不了”——所有网络路径在构建阶段就被物理移除,运行时连错误都报不出来,才算闭环。

















