如何手动修复单个安全问题的npm审核?

21

我有一些由npm audit报告的问题,运行npm audit fix可以解决其中几个。但这样做也会因某种原因破坏我的构建。我认为我知道哪个修复导致了这个问题,但我仍然想修复其它问题。

有没有办法让npm执行运行npm audit fix时所做的任何操作,但仅限于单个问题/依赖项?


我知道我可以运行npm i,但这也会将更新后的依赖项添加到package.json中(即使带有--package-lock-only标志),而我不想要这样。我只想让npm更新package-lock.json,就像我运行npm audit fix时那样,但仅适用于一个选择性的问题子集。

1个回答

32
你应该能够使用npm update来实现你想要的。具体操作略有不同,取决于你是否使用npm 7.x或npm 6.x。我正在使用7.x,所以以下就是我展示的内容。
假设npm audit生成了如下输出:
# npm audit report

minimist  <0.2.1 || >=1.0.0 <1.2.3
Prototype Pollution - https://npmjs.com/advisories/1179
fix available via `npm audit fix`
node_modules/extract-zip/node_modules/minimist
  mkdirp  0.4.1 - 0.5.1
  Depends on vulnerable versions of minimist
  node_modules/extract-zip/node_modules/mkdirp
    extract-zip  <=1.6.7
    Depends on vulnerable versions of mkdirp
    node_modules/extract-zip

3 low severity vulnerabilities

To address all issues, run:
  npm audit fix

这表明我们需要更新minimistmkdirpextract-zip
让我们运行npm ls以了解我们正在处理的版本和依赖关系。
$ npm ls minimist mkdirp extract-zip  
scrape-text@1.0.0 /Users/trott/ucsf-ckm/scrape-text
├─┬ puppeteer@2.1.1
│ └─┬ extract-zip@1.6.7
│   └─┬ mkdirp@0.5.1
│     └── minimist@0.0.8
└─┬ semistandard@14.2.0
  ├─┬ eslint@6.4.0
  │ ├─┬ file-entry-cache@5.0.1
  │ │ └─┬ flat-cache@2.0.1
  │ │   └─┬ write@1.0.3
  │ │     └── mkdirp@0.5.3 deduped
  │ └─┬ mkdirp@0.5.3
  │   └── minimist@1.2.5 deduped
  └─┬ standard-engine@12.0.0
    └── minimist@1.2.5

$ 

因为着色相当重要,这是最后一个的屏幕截图:

Screenshot of the previous text output to show colorization highlighting of the modules we care about

让我们看看如果我们运行npm update minimist来更新该软件包会发生什么。让我们使用npm ls minimist查看是否有任何更改。(您还可以查看package-lock.json文件是否更改并进行差异比较。)

$ npm ls minimist
scrape-text@1.0.0 /Users/trott/ucsf-ckm/scrape-text
├─┬ puppeteer@2.1.1
│ └─┬ extract-zip@1.6.7
│   └─┬ mkdirp@0.5.1
│     └── minimist@0.0.8
└─┬ semistandard@14.2.0
  ├─┬ eslint@6.4.0
  │ └─┬ mkdirp@0.5.3
  │   └── minimist@1.2.5 deduped
  └─┬ standard-engine@12.0.0
    └── minimist@1.2.5

$ 

没有变化。我们仍然拥有之前的相同版本。好的,让我们尝试下一个,即mkdirp

$ npm update mkdirp

changed 1 package, and audited 244 packages in 1s

3 low severity vulnerabilities

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
$

changed 1 package 看起来很有希望。让我们看看它做了什么:

$ npm ls mkdirp    
scrape-text@1.0.0 /Users/trott/ucsf-ckm/scrape-text
├─┬ puppeteer@2.1.1
│ └─┬ extract-zip@1.6.7
│   └── mkdirp@0.5.1
└─┬ semistandard@14.2.0
  └─┬ eslint@6.4.0
    ├─┬ file-entry-cache@5.0.1
    │ └─┬ flat-cache@2.0.1
    │   └─┬ write@1.0.3
    │     └── mkdirp@0.5.5 deduped
    └── mkdirp@0.5.5

这个更新将 mkdirp 更新到了0.5.5版本。您可以测试一下,看看是否仍然正常工作。

如果现在执行 npm update extract-zip,那么会得到一个干净的 npm audit 运行结果。

希望这能让您了解如何逐个更新软件包而不在过程中修改 package.json 文件。祝好运!


感谢您撰写这篇深入浅出的文章。如果您能够提供完整的 package.json,那就更好了。我相信这是制作一个 "minimal, complete, and verifiable example" (MCVE) 所需的全部内容。 - Henke
不确定这个修复了minimist的问题吗? - undefined
在这种情况下,mkdirpextract-zip都依赖于minimist。如果只更新minimist而不更新这两个包是行不通的,因为旧版本的mkdirpextract-zip限制了可以安装的新版本minimist的范围。通过更新这些其他包,minimist也会得到更新。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接