NPM 可以在安装包之前显示包的使用年限吗?

Can NPM show me the age of packages before installing them?

鉴于现有 npm 包中的最新恶意软件,我希望有一种机制可以让我在安装新包或更新现有包之前进行一些基本检查。我的主要问题是我直接安装的包和我间接安装的包。

一般来说,我想在安装之前获取 npm 将安装的包版本列表。更具体地说,我想要将要安装的软件包的使用期限,因此如果其中任何一个不到一天,我可以生成警告。

如果我可以直接用 npm 做那件事,那就太好了,但恐怕我需要围绕它编写一些脚本。

具体用例:

如果我在 2021 年 10 月 22 日执行 npm install react-native-gesture-handler,它会执行恶意版本 ua-parser 的 post-install 挂钩,我的计算机就会受到损害,这是我想避免的事情。

当我输入npm install react-native-gesture-handler --dry-run时,它只告诉我它会安装哪个版本的react-native-gesture-handler,但不会告诉我它会安装一个版本的ua-parser当天发布。

补充说明:

要找出恶意包,您需要一个脚本来检查您的包是否存在针对 national vulnerabilities database

的漏洞

国家漏洞数据库包括安全检查表参考、安全相关软件缺陷、错误配置、产品名称和影响指标的数据库。

大多数软件公司都使用应用程序安全工具,例如 VeracodeSnykCheckmarx通常在 CICD 管道中部署之前的阶段执行此操作。

如果您希望在本地实现这一点,您可以尝试

npm audit

但是这将根据默认注册表审核已安装依赖项和它在项目中的子依赖项(nexus 或 artifactory 或 npm registry) 并为您提供已知漏洞列表以及补丁可用的版本详细信息。

即使 未安装 .[=26=,

npm view 也会为您提供有关该软件包的以下详细信息]

version checks before installing would need a script to do the necessary at preinstall, I would suggest to have a dedicated project for security checks (reusable for all projects), and link or publish it then configure that in your project scripts like below,

安全项目:

这将有脚本来检查漏洞,利用 npm viewnpm version 并审核模块,然后 return 结果。

主要项目:

在这里设置 package.json 中的脚本以使用上面发布的项目并在安装前检查漏洞。

npx security-project vulnerabilities


scripts: {
  vulnerability: npx security-project vulnerabilities
  preinstall: npx security-project vulnerabilities

  or

  preinstall: "sh ./checkVulnerabilities.sh" // this script can take package name through command line flags like --package axios
}

Snyk 获取您的 package.json 并将扫描所有模块以查找安全漏洞。您还可以搜索特定模块并检查版本的健康评分。

https://snyk.io/advisor/check/npm

或者,您可以在 IDE 中使用 Snyk extension 来实现同样的效果。

我们有 RetireJS chrome extension 用于扫描应用程序中存在漏洞的易受攻击的 JS 模块版本。

很好的参考:- 6-tools-you-can-use-to-check-for-vulnerabilities-in-node-js

以上是我能想到的想法,希望对你有帮助。

首先以安全的方式安装包,然后使用npm listnpm view获取安装包的年龄。

选项 1:使用 --ignore-scripts

安装
npm i --ignore-scripts
npm list --depth=100 | awk '{ print $NF }'| tail -n +2 | grep -v "deduped" |  xargs -I {}  bash -c "npm view {} time.modified _id|tr '\n' ' ' && echo "|sort

选项 2:安装在 docker

docker run -v $PWD/package.json:/a/package.json -v $PWD/package-lock.json:/a/package-lock.json --rm -it node:lts-buster bash

cd a && npm i
npm list --depth=100 | awk '{ print $NF }'| tail -n +2 | grep -v "deduped" |  xargs -I {}  bash -c "npm view {} time.modified _id|tr '\n' ' ' && echo "|sort

打印日期的脚本说明:

  • npm list --depth=100 获取已安装包列表
  • | awk '{ print $NF }'从每一行提取包的id
  • | tail -n +2 删除第一行,它指的是当前文件夹
  • | grep -v "deduped" 删除引用欺骗的行
  • | xargs -I {} bash -c 为每一行打开 subshel​​l
  • npm view {} time.modified _id 获取时间和 package-id
  • |tr '\n' ' ' && echo 去掉time和id之间的换行符,在末尾添加换行符
  • |sort 按字母顺序排列行

注意:由于npm view一次通过网络获取1个包,所以脚本安装每个包大约需要1秒,对于中型项目来说,这将增加几分钟。

我找到了另一个解决方案。我可以使用 renovate 代替直接使用 npm 更新,它有一个“stabilityDays”选项:

If this is set to a non-zero value, and an update has a release timestamp header, then Renovate will check if the "stability days" have passed.

https://docs.renovatebot.com/configuration-options/#stabilitydays