如何修复 package-lock.json 中未在 package.json 中列出的易受攻击的 npm 包?

Posted

技术标签:

【中文标题】如何修复 package-lock.json 中未在 package.json 中列出的易受攻击的 npm 包?【英文标题】:How do I fix a vulnerable npm package in my package-lock.json that isn't listed in the package.json? 【发布时间】:2018-10-23 23:54:20 【问题描述】:

Github 告诉我 package-lock.json 文件中的依赖项易受攻击且已过时。问题是,如果我执行npm installnpm update,它们都不会更新 package-lock.json 文件中的依赖关系。

我对此进行了很多谷歌搜索,并删除了文件并完成了npm install

如果有人能帮助解决这个问题,我将不胜感激。有问题的包是 Hoek,我的 package.json 文件中实际上没有它。

非常感谢。

【问题讨论】:

尝试删除你的 package-lock.json 并再次运行 npm install 您可以检查您的依赖关系以找出哪个依赖于 hoek 并更新那个。 (但是您也可能不走运,并且该依赖项没有更新的版本。) 我建议@RishikeshDhokare 也一样 我按照@RishikeshDhokare 所说的做了。为自己解决了问题 【参考方案1】:

听起来 Hoek 是您的依赖项之一的依赖项(因此,您的 package.json 中的包需要它自己的 package.json 中的包)。

您已经尝试删除/重新安装和更新您的项目依赖项但没有成功,因此似乎有问题的包依赖项指定了显式或最大版本。

如果没有看到每个依赖项的 package.json,就很难进一步建议如何强制更新。

编辑: 为了帮助您识别哪些包正在使用哪些依赖项,您可以使用 NPM 的 ls 命令:https://docs.npmjs.com/cli/ls

例如,查看哪些包正在使用 Hoek: npm ls hoek

编辑 2: 正如 Ulysse BN 正确指出的那样,如果您拥有 NPM 版本 6 或更高版本,您可以使用npm audit fix 要求 NPM 尝试为您修复漏洞。

编辑 3: 阅读本文的人还应该在下面查看 JBallin 的答案。它扩展了我在这里提供的信息,并且(在我看来)是一个更结构化的答案,可以更好地解决 OP 的问题。但是 - 如果您想要快速修复 - 这个答案就足够了。

【讨论】:

我在使用不同的包 (Growl) 时遇到了类似的问题。我猜这是我的package.json 中的某个版本,这取决于 Growl 的特定(易受攻击的)版本。你的答案在正确的轨道上,如果你能分享一个命令来显示package.json 中的哪些包取决于package-lock.json 中显示的易受攻击的包,你也许可以确定它。 查看更新的答案。如果您需要其他帮助 - 创建一个新问题。 :) 谢谢。完成:***.com/questions/50764225/… 您确定有必要再提出一个问题吗?它们看起来像是重复的。 @JBallin 我的答案已经更新了好几次。它最初可能没有资格作为副本。【参考方案2】:

用途:

npm 我胡克

npm 将安装最新版本的 hoek,并且您的 package.lock.json 会更新。

【讨论】:

【参考方案3】:

我遇到了这个问题,发现这是因为我运行 npm 的服务器上有旧版本的 npm - package-lock.json 仅受新版本支持。

【讨论】:

【参考方案4】:

如果您有 npm@6 或更高版本,您可以使用 npm audit fix 解决您的安全问题。

【讨论】:

【参考方案5】:

您是否尝试过:转到您的项目根目录,删除package-lock.json 文件、node_modules.cache 文件夹,然后删除npm install

【讨论】:

这在实践中是非常危险的。即使是补丁版本也可以隐藏一些重大错误或重大更改,甚至更糟(例如,黑客在 npmjs.org 上发布新版本的库)。您无法保证更新所有依赖项将使您的项目正常工作。安全的方法是逐步更新依赖关系,通过自动化测试/构建为每个请求创建拉取请求,以确保一切正常。【参考方案6】:

TLDR:使用npm i $PARENT_PKG_NAME 更新父包。


注意

更新依赖项时,您应该查看 CHANGELOG 以了解任何重大更改。

诊断

npm audit 将显示易受攻击的包(请注意,您需要一个 package-lock.json 文件,因此您需要运行npm i),以及它是一个包的依赖(如果适用)。请注意,您还可以使用npm ls $CHILD_PKG_NAME 查看其父依赖项。

快速修复尝试

npm audit fixnpm audit fix --force 值得一试,但有时需要手动修复(见下文)。

手动修复

父包很可能已经修复了它们的依赖项(你可以通过访问他们的 GitHub 并查看最近的提交来验证这一点——或者只是看看这是否修复了它),所以你可以运行 npm i $PARENT_PKG_NAME @$NEW_VERSION 并执行它将更新您的 package-lock.json。

如果父母没有修复漏洞

如果维护者似乎没有响应,您可以考虑使用完成相同任务的替代包或分叉包并自行更新漏洞。

验证修复

您现在可以通过运行npm audit 并确保没有漏洞出现来验证它是否有效。提交您的更改,将它们推送到 GitHub,刷新您的通知/警报,它们应该会消失!

【讨论】:

在我的情况下,快速修复在这个答案中的手册也不起作用,因为父级是一个框架,在更新中完全改变了 API,甚至摆脱了那个库?这是因为父框架仍然使用旧库。事实上,旧的仍然存在但没有更新,我的意思是我该如何继续? @CarmineTambascia 如果你使用的包没有修复它的漏洞(我会打开一个问题/PR 希望它会得到修复) - 我会考虑制作你自己的包分支( s),修复漏洞,代替受影响的软件包。 有没有办法更新子包?如果父包没有修复漏洞? @Harshita 请参阅标题为“如果父级尚未修复漏洞”的部分 @Harshita 你联系到他们了吗?修复这些漏洞也符合他们的利益。【参考方案7】:

安装新依赖后,运行以下命令更新 package-lock.json 文件:

npm update package-lock.json

【讨论】:

【参考方案8】:

要检查易受攻击的 npm 包,只需使用以下命令:

npm audit

要修复易受攻击的 npm 包,只需使用以下命令即可修复 package-lock.json:

npm audit fix

【讨论】:

【参考方案9】:

手动编辑package-lock.json并将易受攻击的软件包版本更新为固定版本然后使用

npm ci

这将根据package-lock.json 安装软件包,首先忽略package.json。然后使用

npm audit fix

再次确认是否正确完成。如果没有帮助,请使用其他给定的解决方案。

更多信息在这里:

https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable

或在这里:https://docs.npmjs.com/auditing-package-dependencies-for-security-vulnerabilities

【讨论】:

另一种解决方案可能是:npmjs.com/package/npm-check-updates 这是一个很好的替代解决方案。如果这是在一个打算发布的包中完成的,那么它将不起作用,因为 package-lock.json 文件没有被发布,但是对于在本地使用包,这可能是npm audit fix 的最佳解决方案是不是一个选项。

以上是关于如何修复 package-lock.json 中未在 package.json 中列出的易受攻击的 npm 包?的主要内容,如果未能解决你的问题,请参考以下文章

修复 package-lock.json 中定义的依赖项中潜在安全漏洞的正确方法

有啥方法可以修复 package-lock.json lockfileVersion 以便 npm 使用特定格式?

你如何在 package-lock.json 中增加传递依赖

删除 `package-lock.json` 以快速解决冲突

如何更新 laravel 中的 package-lock.json 文件?

如何从 package-lock.json 文件制作 package.json [重复]