前言
主要介绍了如何使用 npm audit 命令在 Node.js 项目中检查和修复依赖中的安全漏洞,并提供了解决这些问题的策略和最佳实践。今日前端早读课文章由 @飘飘翻译分享。
正文从这开始~~
在构建 Node.js 项目时,你通常会依赖第三方库来加快开发速度并利用社区支持的解决方案。例如,你可能会使用 axios 这样的包来发起 HTTP 请求,或者使用 express 来设置服务器。这些库本身通常也依赖于其他包才能正常工作。这种依赖关系链可能会变得复杂,并且任何包中的漏洞都可能使您的应用程序面临安全风险。
【第3354期】使用 eslint-plugin-depend 移除无用的 NPM 包
这就是 npm audit 发挥作用的地方。
audit 问题是指什么?
在典型的 Node.js 项目中,当你安装一个包时,你不仅会引入该特定的库,还会引入其整个依赖树。例如:
这会导致了一个多级依赖树,其中可能包含数百甚至数千个包。由于你可能不会直接处理所有这些子依赖项,因此很难手动检查每个包是否存在漏洞。
audit 问题指的是在你的直接依赖项(例如,axios
或 express
)或它们的子依赖项中发现的已知漏洞。npm audit 会根据 npm 维护的公共漏洞数据库,对整个依赖树进行安全漏洞扫描。
【早阅】npm vs npx - 基本区别是什么?
npm audit 做什么?
npm audit
命令通过将项目的依赖项与已知漏洞数据库进行比较来检查项目的安全问题。它扫描 package.json
、package-lock.json
和 node_modules
文件夹中的任何易受攻击的包。
它检查:
在运行完 npm audit
之后,将看到一份详细的报告,其中包含以下信息:
以下是一个 npm 审计报告的示例:
# npm audit report
minimatch <3.0.5
Regular Expression Denial of Service - https://github.com/advisories/GHSA-f8q6-p94x-37v3
fix available via `npm audit fix`
node_modules/minimatch
glob 3.2.3 - 5.0.15
Depends on vulnerable versions of minimatch
node_modules/glob
express >=4.13.0
Depends on vulnerable versions of glob
node_modules/express
这份报告告诉你:
npm audit 的严重性级别
npm 生态系统中的漏洞根据它们可能带来的风险被分为不同严重程度等级:
在上述示例中, minimatch 包被标记为存在 Regular Expression Denial of Service (ReDoS) 漏洞,如果攻击者构造了一个恶意的正则表达式,这可能会是一个严重的性能问题。
解决 npm audit 问题
npm audit 工具不仅会告诉你有哪些漏洞,还会为你提供修复漏洞的方法。
运行 npm audit fix
:对于许多漏洞, npm audit
提供了自动修复功能。你可以运行:
npm audit fix
此命令尝试将你的软件包升级到非易受攻击的版本,同时保持向后兼容性。它将安装遵循语义版本控制的补丁版本(patch 版本)的软件包,这意味着你不必担心破坏性更改。
使用 npm audit fix —force
: 在某些情况下,自动修复可能需要破坏性更改,因为依赖项的更高版本会大幅提升主版本号。要修复这些问题,您可以使用 --force
选项:
npm audit fix --force
这将尝试安装包的最新版本,即使这意味着主要版本更新,这可能会破坏你现有代码的兼容性。在使用 --force
时要小心,因为它可能会安装可能导致代码兼容性问题的更新。
在前面的例子中,假设要修复 minimatch 漏洞,可能需要升级到 glob 的更高版本,这可能会为 express 引入破坏性更改。在这种情况下, npm audit fix --force
将执行必要的更新,但你需要彻底测试你的项目以确保所有内容仍然可以正常工作。
为什么在修复后 npm audit 问题后仍然存在
你可能会遇到这样的情况,即使按照 npm audit 给出的建议修复了问题,漏洞仍然存在。这可能会让人感到沮丧,但通常是由于更深层次的嵌套依赖或包元数据未解决的问题导致的。让我们一起探讨当 npm audit fix 不起作用时,如何解决这些问题。
解决持续存在的 npm audit 问题
1、移除 package-lock.json :有时,锁定文件可能是遗留依赖问题的原因。首先删除 package-lock.json 文件。
2、移除 node_modules :删除 node_modules 目录可确保所有依赖项重新安装并更新
3、获取该易受攻击软件包的最新稳定版本:为了确保您正在使用安全版本,请检查该易受攻击软件包的最新稳定版本。你可以使用 npm 命令进行此操作:
npm show minimatch version
4、添加 'overrides' 部分:如果您尚未这样做,可以使用 npm 的 "overrides" 功能(从 npm 8 及以上版本中可用)来强制安装特定版本的易受攻击的包。这样可以确保 npm 在所有依赖项中安装非易受攻击的包版本。在你的 package.json 中,添加或更新 overrides
部分。例如,为了确保 minimatch 使用安全版本,可以添加:
"overrides": {
"minimatch": "10.0.1"
}
5、重新安装依赖项:在更新了 overrides 部分并确保 package-lock.json 和 node_modules 被移除后。运行 npm install 重新安装已更新的依赖项。
6、处理嵌套依赖:在某些情况下,受影响的包可能深嵌在依赖树中(即,它是另一个包的子依赖),您可能需要在 package.json 中维护这种嵌套层次结构,以确保覆盖正确应用。例如,如果 minimatch 是像 glob 这样的子包的依赖,而 glob 被 express 使用,您可以添加如下覆盖:
"overrides": {
"minimatch": {
"glob": "^7.1.7",
"another-package": "^1.0.0"
}
}
这种结构确保了覆盖应用于依赖树中所有 minimatch 的实例,即使它们是嵌套的。
通过遵循这些步骤,您可以在运行 npm audit fix
之后解决持续存在的 npm audit 问题。这种方法可以确保即使在深度嵌套的依赖关系中,也能通过在整个依赖树中强制使用安全版本的包来解决漏洞。
预防措施:管理依赖性的最佳实践
1、定期运行 npm audit:养成定期运行 npm audit 的习惯,尤其是在添加新依赖或在将代码推送到生产环境之前。这有助于早期发现漏洞并防止它们积累。
2、保持依赖项更新:使用工具如 npm outdated 或 npm-check 查看是否存在可用的更新版本或更安全的依赖项。保持依赖项更新是减少漏洞暴露的关键步骤。
3、使用 npm audit --production
:如果某些漏洞仅与开发依赖项(如构建工具或测试框架)相关,可以通过运行以下命令将审计范围缩小到仅包含生产依赖项:
npm audit --production
这可以确保你只看到可能影响您部署的应用的问题。
4、切换到活跃维护的库:如果你正在使用一个不再活跃维护且存在未解决安全问题的库,考虑切换到一个更活跃维护的替代品。例如,如果 jsonwebtoken 不再维护且存在关键漏洞,你可能会切换到另一个处理 JWT 的流行库,如 node-jose 。
结论
npm audit 是识别和修复 Node.js 项目中安全漏洞的不可或缺的工具。它通过突出显示已知的安全问题,帮助您在复杂的直接和间接依赖关系之间导航,并指导您找到解决方案。
然而,如果不引入破坏性更改,自动修复可能并不总是可行的,有时即使更新了,漏洞也可能仍然存在。了解 npm 依赖项的工作原理、保持包版本的最新状态,以及知道何时应用手动补丁,对于确保 Node.js 应用程序的安全性大有裨益。
通过定期审计、自动化修复和仔细打补丁的主动方式进行依赖管理,可以确保应用程序的安全性和及时更新,从而将安全漏洞的风险降至最低。
关于本文
译者:@飘飘
作者:@Niraj Chauhan
原文:https://www.niraj.life/blog/understanding-npm-audit-fixing-vulnerabilities-nodejs/
这期前端早读课
对你有帮助,帮” 赞 “一下,
期待下一期,帮” 在看” 一下 。