DEV Community

[yun]
[yun]

Posted on

如何修正npm/yarn的security问题

审核程序包相关性是否存在安全漏洞

关于安全审核

根据npm官方docs

A security audit is an assessment of package dependencies for security vulnerabilities. Security audits help you protect your package's users by enabling you to find and fix known vulnerabilities in dependencies that could cause data loss, service outages, unauthorized access to sensitive information, or other issues.

简单来说就是对package dependencies进行安全漏洞评估以确保已知安全漏洞得到修复。

安全漏洞能否自动修复?

在一定程度上是能的。npm提供了npm audit fix自动修复程序,能自动将有安全漏洞问题的dependencies更新到目前安全的兼容版本。杯具的是,yarn目前只提供了安全审核yarn audit,并没有可用的自动修复程序。所以yarn用户需要一些特殊的步骤来实现自动修复。

使用npm修复安全漏洞

使用npm审核修复略为简单,只需运行npm audit fix就能自动更新有安全漏洞的dependencies。但是,在某些情况下可能需要手动检查与更新。在这种情况下,npm通常会显示如何解决该特定dependency。

使用yarn修复安全漏洞

如前所述,yarn没有类似yarn audit fix的自动指令。因此,我们必须依靠两种方法:

1. 使用npm来解决

如果您使用的是yarn项目,则运行npm audit fix将得到以下的error:

npm ERR! code ENOLOCK
npm ERR! audit This command requires an existing lockfile.
npm ERR! audit Try creating one first with: npm i --package-lock-only
npm ERR! audit Original error: loadVirtual requires existing shrinkwrap file

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/andylow/.npm/_logs/2021-04-30T06_22_16_004Z-debug.log
Enter fullscreen mode Exit fullscreen mode

我们可以跟着指示运行npm i --package-lock-only,这个指令将创建一个package-lock.json文件。

然后我们可以再次运行npm audit fix来达成自动修复。

最后,别忘了删除package-lock.json,因为它与yarn.lock会发生冲突。

2. 更新使用yarn audit发现的dependencies

在运行yarn audit之后,会显示哪些dependencies拥有安全漏洞以及哪个版本已经修复了漏洞。

现在来了棘手的问题。在Project中可能有多个依赖项使用相同的dependency,但是它们可能使用的版本不同。值得庆幸的是,yarn提供了选择性的dependency解决方案

我们可以用以下的格式在package.json中定义resolutions:

/* package.json */
{
  "resolutions": {
    "<package>/**/<dependency>": "<version>"
  }
}
Enter fullscreen mode Exit fullscreen mode

假设我们有一个dependency A和dependency B,并且它们都依赖于另一个dependency C。它们的关系由以下结构定义:

.
├── A
|   ├── C (3.1.3)
|   └── D
├── B
|   └── C (1.0.2)
Enter fullscreen mode Exit fullscreen mode

resolutions里可以这么写:

/* package.json */
{
  "resolutions": {
    "A/**/C": "3.1.3", 
    "B/**/C": "1.0.2"
  }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)