npm audit 修复后为什么还有高危漏洞?
我刚跑完 npm audit fix,结果提示“fixed 5 of 12 vulnerabilities”,但剩下的 7 个还是高危。我查了下,有些是间接依赖,比如通过某个 UI 库引入的旧版 lodash。手动升级主依赖也没用,因为那个 UI 库还没更新。现在项目要上线,安全扫描过不了,真不知道该怎么处理这些“卡住”的漏洞了。
有没有办法在不 fork 第三方库的情况下,强制替换掉有问题的子依赖?比如用 resolutions 字段?我试过在 package.json 里加:
{
"resolutions": {
"lodash": "^4.17.21"
}
}
但好像只对 yarn 有效,我们项目用的是 npm……是不是得换包管理器才行?还是有别的解法?
npm 的 overrides 字段
从 npm 8.3 版本开始(也就是 Node 16+ 对应的 npm 版本),你可以用 overrides 字段来强制替换子依赖。resolutions 那个字段是 yarn 先搞的,npm 虽然后来也支持了,但官方推荐用 overrides。
在你的 package.json 里这样写:
这样会强制项目中所有版本的 lodash 都用 4.17.21,包括通过那个 UI 库引入的旧版。
如果只想替换特定包下面的 lodash,可以这样:
为什么 overrides 能生效
npm 在安装依赖时会检查 overrides 字段,如果有匹配的就会强制使用你指定的版本,忽略子依赖声明的版本号。这相当于告诉 npm:“别管那个 UI 库说要什么版本的 lodash,我就要用这个”。
操作步骤
第一步,确认你的 npm 版本够新:
如果是 8.3 以上就直接用 overrides。
第二步,修改 package.json 添加 overrides 字段。
第三步,删掉 node_modules 和 package-lock.json:
第四步,重新安装:
第五步,再跑一遍 audit 看看:
需要注意的点
overrides 会影响所有引用那个包的代码,如果新版本有 breaking change 可能会出问题。不过 lodash 4.17.21 是小版本升级,兼容性一般没问题。
如果 overrides 不生效(比如 npm 版本太旧),你可以考虑升级 npm:
或者真的想省事,yarn 的 resolutions 确实更成熟,用法也简单:
跑完 yarn install 或 yarn-deduplicate 就行。不过换包管理器涉及团队协作成本,你自己权衡。
基本上 overrides 就是你要的方案,不用 fork 第三方库,也不用换 yarn。试试看能不能把那些漏洞修掉。