【问题标题】:npm audit versus yarn auditnpm 审计与纱线审计
【发布时间】:2021-08-04 22:53:12
【问题描述】:

我有一个使用 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?

【问题讨论】:

    标签: node.js npm yarnpkg auditing


    【解决方案1】:

    如果不查看锁定文件并进行比较,很难估计为什么会发生这种情况。但是,据我所知,只有当两个锁定文件都解析为相同依赖项的不同版本时,才会发生这种情况。
    您的 yarn.lock 文件是较早生成的,因此它包含易受攻击的旧版本的依赖项,并且由于之后生成了 package-lock.json,它会解析为这些依赖项的最新/固定版本。

    请记住,npm i --package-lock-only 只会创建 package-lock.json 文件,不安装任何东西,但它不会与实际安装的软件包相提并论。我认为您假设运行该命令只会从已安装的软件包中派生锁定文件,但它实际上会生成锁定文件,就好像您在没有标志的情况下运行它一样。

    因此,总而言之,两个锁定文件都解析为相同依赖项的不同(次要/补丁)版本。

    【讨论】:

      【解决方案2】:

      这不是 Yarn 和 Npm 之间的直接比较。确实,他们不会报告完全相同的审计警告,但如果您执行以下操作,您可以从 Yarn 获得相同/相似的结果:

      rm ./yarn.lock
      yarn
      yarn audit
      

      这是为什么呢?因为 Yarn 使用的是您之前的依赖管理工作中的知识,而 Npm 是从头开始的,以前从未在您的项目中运行过。如果你删除yarn.lock,Yarn 也会从头开始。无论哪种方式,您都将获得所有库的最新补丁级别版本,否则您将无法获得。这将导致您的许多审核警告消失。

      那么yarn.lockpackage-lock.json 是什么?每次成功安装运行后,Yarn 都会将您的 node_modules(您的依赖树)的最新状态保存在 yarn.lock 中。 NPM 在package-lock.json 中做同样的事情。这两个自动生成的文件就像您的 package.json 的详细版本,列出了您安装的每个依赖项和子依赖项(版本号低至 x.x.x 补丁级别) - 以及安装它们的原因。这样,您的 node_modules 在每次运行 yarn installnpm install 时看起来都完全相同。

      但是,这 2 个锁定文件由各自的包管理器专门使用并且不兼容:如果您以交替方式使用 Yarn 和 Npm 可能会不断更改您的 node_modules。这将导致许多微妙的错误。这就是为什么您通常应该在一个项目中坚持使用 Yarn 或 Npm。

      【讨论】:

        猜你喜欢
        • 2019-01-14
        • 2019-08-03
        • 2021-09-07
        • 2021-08-11
        • 2018-11-18
        • 2020-06-30
        • 1970-01-01
        • 2013-10-16
        • 2019-11-04
        相关资源
        最近更新 更多