一款注重安全的 npm 安装工具,可保护您的项目免受新被入侵的包的影响。
针对 npm 包的供应链攻击正在成为一种日益增长的威胁。攻击者有时会通过以下方式入侵合法包:
这些攻击往往突然发生——昨天还安全的包今天可能已被入侵。safe-npm 通过只安装那些已公开发布至少一段最短时间(默认 90 天)的包版本来保护您。这样,安全社区就有时间在恶意版本到达您的项目之前发现并报告它们。
当您运行 safe-npm install 时,它会:
package.json 或命令行参数读取您的依赖项例如,如果您指定 react@^18 并且一个恶意的 [email protected] 是昨天发布的,safe-npm 将安装最新的、至少 90 天前的版本。
# 全局安装
npm install -g @dendronhq/safe-npm
# 现在您可以在任何地方使用它
safe-npm install
# 克隆并构建
git clone <repository-url>
cd safe-npm
npm install
npm run build
# 全局链接二进制文件
npm link
# 使用最小 90 天(默认)
safe-npm install
# 或指定您自己的最小天数
safe-npm install --min-age-days 120
# 直接安装带版本约束的包
safe-npm install react@^18 lodash@^4.17.0
# 这些包将被过滤,只使用至少 90 天前的版本
safe-npm install express --min-age-days 60
# 预览将安装哪些版本,而不实际安装
safe-npm install --dry-run
--min-age-days <n>默认值: 90
一个包版本必须已发布的最小天数,之后才能被安装。
示例: --min-age-days 120 要求包至少已存在 4 个月。
何时调整:
--ignore <pkg1,pkg2>一个逗号分隔的包列表,这些包将绕过年龄要求。这些包仍会遵循语义化版本范围,但忽略最小年龄。
示例: --ignore typescript,@types/node
何时使用:
--strict如果任何依赖项无法解析到满足年龄要求的版本,则退出并报错。
示例: safe-npm install --strict
何时使用:
--dev / --prod-only控制处理 package.json 中的哪些依赖项。
示例:
safe-npm install --dev - 仅安装 devDependenciessafe-npm install --prod-only - 仅安装生产依赖何时使用:
--strategy <direct|overrides>默认值: direct
safe-npm 如何安装解析后的版本:
direct - 直接使用 npm install package@version 安装解析后的版本
overrides - 将解析后的版本写入 package.json 的 overrides 字段,然后运行 npm install
--registry <url>默认值: https://registry.npmjs.org
指定一个备用的 npm 注册表。
示例: --registry https://registry.company.com
何时使用:
--dry-run显示将要安装的内容,而不做任何更改。
示例: safe-npm install --dry-run
何时使用:
# 创建新项目
mkdir my-project && cd my-project
npm init -y
# 安全地安装依赖
safe-npm install express@^4 lodash
# 这将创建带有至少 90 天前版本的 package-lock.json
# 检查在年龄要求下将安装哪些版本
safe-npm install --dry-run
# 如果您满意,就安装它们
safe-npm install
# 在 CI 管道中,如果任何包无法满足年龄要求则构建失败
safe-npm install --strict --min-age-days 120
# 或者仅对开发依赖允许较新的包
safe-npm install --prod-only --strict
# 需要紧急更新特定包?将其添加到忽略列表
safe-npm install --ignore package-with-critical-fix
该项目包含一个测试套件,您可以运行:
npm test
对于自动测试,您可以使用 fixtures 模拟注册表响应:
export SAFE_NPM_FIXTURES=/path/to/fixtures.json
safe-npm install
fixtures 文件应包含镜像 npm 注册表对每个包响应的 JSON。
真实场景:
popular-lib 由一位受信任的开发者维护[email protected]^5.0.0 的项目会立即安装恶意版本4.9.0(90 天前的最新版本)安全性是关于权衡的。safe-npm 用跟随最新边缘更新的能力,换取免受突然的供应链入侵的保护。它是纵深防御策略中的一层,还应包括:
npm audit)ISC