执行NPM建议命令后仍无法修复漏洞,该如何解决?
每次我在项目里安装新的NPM模块后,都会收到这样的漏洞警告:
[!] 40 vulnerabilities found - Packages audited: 5840 (0 dev, 299 optional) Severity: 8 Low | 24 Moderate | 8 High
我随即执行npm audit查看详情,得到的提示比如:
# Run npm install npm@6.0.1 to resolve 22 vulnerabilities SEMVER WARNING: Recommended action is a potentially breaking change ┌───────────────┬──────────────────────────────────────────────────────────────┐ │ Moderate │ Prototype pollution │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Package │ hoek │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Dependency of │ npm │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Path │ npm > libcipm > npm-lifecycle > node-gyp > request > hawk > │ │ │ boom > hoek │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ More info │ https://nodesecurity.io/advisories/566 │ └───────────────┴──────────────────────────────────────────────────────────────┘
还有类似这样的:
# Run npm update fsevents --depth 2 to resolve 3 vulnerabilities ┌───────────────┬──────────────────────────────────────────────────────────────┐ │ Low │ Regular Expression Denial of Service │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Package │ debug │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Dependency of │ chokidar │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Path │ chokidar > fsevents > node-pre-gyp > tar-pack > debug │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ More info │ https://nodesecurity.io/advisories/534 │ └───────────────┴──────────────────────────────────────────────────────────────┘
我照着提示执行了npm install npm@6.0.1(哪怕我已经装了这个版本),又跑了npm update fsevents --depth 2,但再次执行npm audit后,漏洞数还是40个,完全没变化,其中还有几个高危漏洞,这该怎么解决?
实用解决方案尝试
1. 清理缓存+重装依赖,先解决最基础的缓存问题
NPM缓存有时候会“卡住”,导致依赖更新没有真正生效。先执行这套命令彻底清理后重装:
npm cache clean --force rm -rf node_modules package-lock.json npm install
重装完成后再跑npm audit,看看漏洞是否有变化。
2. 强制修复或强制指定依赖版本
尝试npm audit fix --force
如果常规更新没用,可以试试强制修复命令——它会跳过版本兼容性检查,直接把有漏洞的依赖更新到修复版本。不过要注意:执行前最好备份项目,避免因为版本不兼容导致功能崩溃。
npm audit fix --force
用npm-force-resolutions强制锁定依赖版本
对于深层嵌套的依赖,npm update经常无法触及,这时候可以用这个工具强制指定某个依赖的安全版本:
- 先安装工具:
npm install npm-force-resolutions --save-dev - 在
package.json里添加resolutions字段,比如针对你遇到的hoek漏洞,指定它的安全版本:"resolutions": { "hoek": "4.2.1" } - 给
package.json的scripts加个预安装钩子,确保每次安装依赖都先执行版本锁定:"scripts": { "preinstall": "npx npm-force-resolutions" } - 最后重新安装依赖:
npm install
3. 检查Node.js与NPM的版本兼容性
你尝试安装npm@6.0.1,但如果你的Node.js版本和这个NPM版本不兼容,也会导致依赖更新失效。先确认两者版本是否匹配:
node -v npm -v
如果版本不匹配,建议升级/降级Node.js到对应兼容的版本(比如NPM 6.x通常对应Node.js 10.x-14.x区间),再重新安装依赖。
4. 忽略不影响生产的漏洞
如果有些漏洞来自可选依赖或者开发依赖,且确认不会影响生产环境,可以选择性忽略:
- 只检查生产依赖的漏洞:
npm audit --production - 在
package.json里指定忽略特定漏洞(用漏洞编号,就是你在提示里看到的566、534这类):"audit": { "ignore": [ "566", "534" ] }
5. 手动更新深层依赖
如果某个深层依赖始终无法被自动更新,可以手动定位它并安装安全版本。比如针对debug的漏洞,先查看当前安装的版本:
npm ls debug
然后直接安装修复后的版本:
npm install debug@<安全版本号> --save
内容的提问来源于stack exchange,提问作者Mouradif

