如何修复package-lock.json中未在package.json列出的脆弱npm包?
解决嵌套依赖Hoek的漏洞问题
我之前也碰到过这种嵌套依赖漏洞的头疼问题——明明package.json里没写Hoek,却被GitHub提示它有漏洞,而且常规的npm install/npm update根本碰不到它。这是因为Hoek是某个直接依赖的子依赖,藏在依赖树的深层,直接操作顶层依赖影响不到它。给你几个亲测有效的解决办法:
第一步:先找到Hoek的“上层依赖”
首先得搞清楚是哪个包把Hoek带进来的,执行下面的命令:
npm ls hoek
输出会显示Hoek在依赖树里的路径,比如类似这样:
your-project@1.0.0 /path/to/your/project └─┬ hapi@16.1.0 └── hoek@4.2.1
这样你就知道是hapi这个直接依赖引入了有漏洞的Hoek版本。
解决方法一:用npm官方的Overrides(推荐,npm 8.3+适用)
如果你的npm版本是8.3及以上,这是最省心的方法——直接在package.json里添加overrides字段,强制指定Hoek的安全版本:
{ "name": "your-project", "version": "1.0.0", // 其他字段... "overrides": { "hoek": "9.3.0" // 替换成GitHub提示的安全版本号 } }
保存后执行npm install,此时package-lock.json里的Hoek版本会被强制替换成你指定的安全版本,不管上层依赖原本要求的是什么版本。
解决方法二:用npm-force-resolutions工具(兼容旧版npm)
如果你的npm版本低于8.3,不支持overrides,就用这个工具来强制替换嵌套依赖:
- 先安装它作为开发依赖:
npm install --save-dev npm-force-resolutions
- 在package.json里添加
resolutions字段和preinstall脚本:
{ "name": "your-project", "version": "1.0.0", // 其他字段... "scripts": { "preinstall": "npx npm-force-resolutions" }, "resolutions": { "hoek": "9.3.0" // 替换成安全版本号 } }
- 删除
node_modules和package-lock.json,重新执行npm install,这个工具会在install前自动把依赖树里的Hoek替换成指定的安全版本。
解决方法三:更新上层依赖
如果通过npm ls hoek找到的上层依赖(比如上面例子里的hapi)已经发布了新版本,而且新版本里已经替换了安全的Hoek,那直接更新这个上层依赖就行:
- 执行
npm update [上层依赖名],比如npm update hapi - 或者手动修改package.json里该依赖的版本号为最新稳定版,再执行
npm install
验证修复结果
执行npm ls hoek,确认输出的版本是你指定的安全版本,然后让GitHub重新扫描你的仓库,漏洞提示应该就消失了。
内容的提问来源于stack exchange,提问作者Raph117
相关产品推荐
相关产品推荐

