npm 审计与 yarn 审计
npm audit versus yarn audit
我有一个使用 yarn
作为包管理器的 React Native 项目 (0.61.4)。
当我 运行 yarn audit
报告大量漏洞时:
18202 vulnerabilities found - Packages audited: 958823
Severity: 18202 High
✨ Done in 14.34s.
大多数都在一些非常深的依赖路径中。例如:
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ high │ Prototype Pollution │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ lodash │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in │ >=4.17.12 │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ react-native │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ react-native > @react-native-community/cli > │
│ │ metro-react-native-babel-transformer > @babel/core > lodash │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://www.npmjs.com/advisories/1065 │
└───────────────┴──────────────────────────────────────────────────────────────┘
当我运行npm audit
时,它首先报告:
Neither npm-shrinkwrap.json nor package-lock.json found: Cannot audit a project without a lockfile
所以我运行:
npm i --package-lock-only
生成了一个package-lock.json
文件。经检查,此文件似乎是正确的。
当我现在运行npm audit
时,结果是:
=== npm audit security report ===
found 0 vulnerabilities
我不明白这两个包管理器之间的差异。为什么npm
报0个错误,而yarn
报18.202?
如果不查看锁定文件并进行比较,很难估计为什么会发生这种情况。但是,据我所知,只有当两个锁定文件都解析为相同依赖项的不同版本时才会发生这种情况。
您的 yarn.lock
文件是较早生成的,因此它包含易受攻击的旧版本依赖项,并且由于 package-lock.json
是之后生成的,它会解析为这些依赖项的 latest/fixed 版本。
请记住,npm i --package-lock-only
只会创建 package-lock.json 文件,不会安装任何东西,但它不会与实际安装的软件包保持一致。我认为您假设 运行 该命令只会从已安装的软件包中派生锁定文件,但它实际上会生成锁定文件,就好像您 运行 它没有标志一样。
总之,两个锁定文件都解析为相同依赖项的不同 (minor/patch) 版本。
这不是 Yarn 和 Npm 之间的同类比较。的确,他们不会报告完全相同的审计警告,但如果您执行以下操作,您可以从 Yarn 获得 same/similar 结果:
rm ./yarn.lock
yarn
yarn audit
这是为什么?因为 Yarn 使用的是你以前的依赖管理工作中的知识,而 Npm 是从头开始的,之前从未 运行 在你的项目中。如果删除 yarn.lock
,Yarn 也会从头开始。无论哪种方式,您都将获得所有库的最新补丁级别版本,否则您将无法获得。这将导致您的许多审核警告消失。
那么 yarn.lock
和 package-lock.json
是什么?每次成功安装 运行 后,Yarn 都会在 yarn.lock
中保存 node_modules
(你的依赖树)的最新状态。 NPM 在 package-lock.json
中做同样的事情。这两个自动生成的文件就像您的 package.json
的详细版本,列出了您已安装的每个依赖项和子依赖项(版本号低至 x.x.x 补丁级别)——以及安装它们的原因。这样,您的 node_modules
在 yarn install
或 npm install
的每个 运行 上看起来完全相同。
但是,这 2 个锁定文件仅由各自的包管理器使用并且不兼容:如果您以交替方式使用 Yarn 和 Npm,它们可能会不断更改您的 node_modules
。这会导致很多细微的错误。这就是为什么您通常应该在一个项目中坚持使用 Yarn 或 Npm。
我有一个使用 yarn
作为包管理器的 React Native 项目 (0.61.4)。
当我 运行 yarn audit
报告大量漏洞时:
18202 vulnerabilities found - Packages audited: 958823
Severity: 18202 High
✨ Done in 14.34s.
大多数都在一些非常深的依赖路径中。例如:
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ high │ Prototype Pollution │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ lodash │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Patched in │ >=4.17.12 │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ react-native │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ react-native > @react-native-community/cli > │
│ │ metro-react-native-babel-transformer > @babel/core > lodash │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://www.npmjs.com/advisories/1065 │
└───────────────┴──────────────────────────────────────────────────────────────┘
当我运行npm audit
时,它首先报告:
Neither npm-shrinkwrap.json nor package-lock.json found: Cannot audit a project without a lockfile
所以我运行:
npm i --package-lock-only
生成了一个package-lock.json
文件。经检查,此文件似乎是正确的。
当我现在运行npm audit
时,结果是:
=== npm audit security report ===
found 0 vulnerabilities
我不明白这两个包管理器之间的差异。为什么npm
报0个错误,而yarn
报18.202?
如果不查看锁定文件并进行比较,很难估计为什么会发生这种情况。但是,据我所知,只有当两个锁定文件都解析为相同依赖项的不同版本时才会发生这种情况。
您的 yarn.lock
文件是较早生成的,因此它包含易受攻击的旧版本依赖项,并且由于 package-lock.json
是之后生成的,它会解析为这些依赖项的 latest/fixed 版本。
请记住,npm i --package-lock-only
只会创建 package-lock.json 文件,不会安装任何东西,但它不会与实际安装的软件包保持一致。我认为您假设 运行 该命令只会从已安装的软件包中派生锁定文件,但它实际上会生成锁定文件,就好像您 运行 它没有标志一样。
总之,两个锁定文件都解析为相同依赖项的不同 (minor/patch) 版本。
这不是 Yarn 和 Npm 之间的同类比较。的确,他们不会报告完全相同的审计警告,但如果您执行以下操作,您可以从 Yarn 获得 same/similar 结果:
rm ./yarn.lock
yarn
yarn audit
这是为什么?因为 Yarn 使用的是你以前的依赖管理工作中的知识,而 Npm 是从头开始的,之前从未 运行 在你的项目中。如果删除 yarn.lock
,Yarn 也会从头开始。无论哪种方式,您都将获得所有库的最新补丁级别版本,否则您将无法获得。这将导致您的许多审核警告消失。
那么 yarn.lock
和 package-lock.json
是什么?每次成功安装 运行 后,Yarn 都会在 yarn.lock
中保存 node_modules
(你的依赖树)的最新状态。 NPM 在 package-lock.json
中做同样的事情。这两个自动生成的文件就像您的 package.json
的详细版本,列出了您已安装的每个依赖项和子依赖项(版本号低至 x.x.x 补丁级别)——以及安装它们的原因。这样,您的 node_modules
在 yarn install
或 npm install
的每个 运行 上看起来完全相同。
但是,这 2 个锁定文件仅由各自的包管理器使用并且不兼容:如果您以交替方式使用 Yarn 和 Npm,它们可能会不断更改您的 node_modules
。这会导致很多细微的错误。这就是为什么您通常应该在一个项目中坚持使用 Yarn 或 Npm。