如何保证你的 JavaScript 项目安全

2025-06-10

如何保证你的 JavaScript 项目安全

如果您正在构建一个 JavaScript 项目,您很可能会整合许多不同的开源项目。毕竟,何必再去重新发明轮子呢?很可能已经有人开发并创建了一个软件包,可以完成您大部分想要完成的工作!根据最新的《软件供应链现状》报告,大约 80% 到 90% 的现代应用程序都包含开源组件。

您有多大把握确保所有这些开源组件都不存在安全漏洞?所有这些组件的依赖项又如何?或者,这些依赖项的依赖项的依赖项又如何?

乌龟全下来了!

我的意思是,这就像乌龟一样,依赖关系一直存在,如果没有自动化工具,你就无法知道你的应用程序是否真正安全。

什么是 AuditJS

AuditJS是一款旨在帮助您解答这个问题并确保您的依赖项(以及它们的所有依赖项)不存在安全漏洞的工具。AuditJS 是一个由 JavaScript 社区编写并由 Sonatype 赞助的开源命令行工具。它使用 Sonatype 的OSS Index v3 REST API来识别已知漏洞和过时的软件包版本。

我为什么要使用 AuditJS?

AuditJS 是一个命令行工具,支持任何使用包管理器将 npm 依赖项安装到 node_modules 文件夹中的项目(例如 npm、angular、yarn、bower 等)。AuditJS 会扫描你的 package.json 文件,并查找其中的漏洞。

AuditJS 的优点在于,它不仅会扫描 package.json 中的包,还会扫描依赖项的所有依赖项,直至最底层。即使是传递依赖项,也能知道是否存在安全漏洞,这能让你安心不少!

替代文本

如何使用 AuditJS?

要使用 AuditJS,首先导航到任何包含 node_modules 文件夹且安装了 Node LTS 8.x 或更高版本的项目。然后,您可以通过以下两种方式之一运行 AuditJS。最简单的方法是通过npx运行它

npx auditjs@latest ossi

如果您愿意,也可以全局安装 AuditJS

npm install -g auditjs

无论您是全局安装 AuditJS 还是通过 npx 运行它,用法都是相同的。您可以设置配置,使用Sonatype OSS Index审核您的应用程序,或者使用Nexus IQ 服务器实例审核您的应用程序

  auditjs config          Set config for OSS Index or Nexus IQ Server
  auditjs ossi [options]  Audit this application using Sonatype OSS Index
  auditjs iq [options]    Audit this application using Nexus IQ Server

OSS Index 确实存在速率限制 - 想要提高限制,您可以注册一个 OSS Index 的免费帐户。AuditJS 会将结果缓存 12 小时,这也有助于限制速率。

您可以查看 AuditJS 使用页面,了解使用 OSS Index 和 Nexus IQ 服务器进行审计的其他配置选项。

我运行了 AuditJS - 现在怎么办?

一旦运行 AuditJS,它就会将结果输出到屏幕上

$ npx auditjs@latest ossi
npx: installed 109 in 13.27s
 ________   ___  ___   ________   ___   _________       ___   ________      
|\   __  \ |\  \|\  \ |\   ___ \ |\  \ |\___   ___\    |\  \ |\   ____\     
\ \  \|\  \\ \  \\\  \\ \  \_|\ \\ \  \\|___ \  \_|    \ \  \\ \  \___|_    
 \ \   __  \\ \  \\\  \\ \  \ \\ \\ \  \    \ \  \   __ \ \  \\ \_____  \   
  \ \  \ \  \\ \  \\\  \\ \  \_\\ \\ \  \    \ \  \ |\  \\_\  \\|____|\  \  
   \ \__\ \__\\ \_______\\ \_______\\ \__\    \ \__\\ \________\ ____\_\  \ 
    \|__|\|__| \|_______| \|_______| \|__|     \|__| \|________||\_________\
                                                                \|_________|


  _      _                       _   _              
 /_)    /_`_  _  _ _/_   _  _   (/  /_`_._  _   _/ _
/_)/_/ ._//_// //_|/ /_//_//_' (_X /  ///_'/ //_/_\ 
   _/                _//                            

  AuditJS version: 4.0.14

✔ Starting application
✔ Getting coordinates for Sonatype OSS Index
✔ Auditing your application with Sonatype OSS Index
✔ Submitting coordinates to Sonatype OSS Index
✔ Reticulating splines
✔ Removing whitelisted vulnerabilities

  Sonabot here, beep boop beep boop, here are your Sonatype OSS Index results:
  Total dependencies audited: 201

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[1/201] - pkg:npm/@babel/runtime@7.4.4 - No vulnerabilities found!
[2/201] - pkg:npm/@babel/runtime@7.9.2 - No vulnerabilities found!
[3/201] - pkg:npm/@emotion/hash@0.8.0 - No vulnerabilities found!
...
[66/201] - pkg:npm/angular-vs-repeat@1.1.7 - No vulnerabilities found!
[67/201] - pkg:npm/angular-xeditable@0.2.0 - No vulnerabilities found!
[68/201] - pkg:npm/angular@1.6.10 - 1 vulnerability found!

  Vulnerability Title:  CWE-20: Improper Input Validation
  ID:  f6068161-e90a-4dfc-a613-be7a54d0580f
  Description:  The product does not validate or incorrectly validates input that can affect the control flow or data flow of a program.
  CVSS Score:  8.2
  CVSS Vector:  CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:H
  CVE:  undefined
  Reference:  https://ossindex.sonatype.org/vuln/f6068161-e90a-4dfc-a613-be7a54d0580f

[69/201] - pkg:npm/axios@0.19.2 - No vulnerabilities found!
...
[191/201] - pkg:npm/regenerator-runtime@0.13.5 - No vulnerabilities found!
[192/201] - pkg:npm/rw@1.3.3 - No vulnerabilities found!
[193/201] - pkg:npm/scheduler@0.13.6 - No vulnerabilities found!
[194/201] - pkg:npm/semver@1.1.4 - 2 vulnerabilities found!

  Vulnerability Title:  [CVE-2015-8855]  Resource Management Errors
  ID:  630522d1-8cab-41ea-9c11-c4978a195661
  Description:  The semver package before 4.3.2 for Node.js allows attackers to cause a denial of service (CPU consumption) via a long version string, aka a "regular expression denial of service (ReDoS)."
  CVSS Score:  7.5
  CVSS Vector:  CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
  CVE:  CVE-2015-8855
  Reference:  https://ossindex.sonatype.org/vuln/630522d1-8cab-41ea-9c11-c4978a195661

  Vulnerability Title:  CWE-400: Uncontrolled Resource Consumption ('Resource Exhaustion')
  ID:  00864743-f576-4ce5-a8f6-2b933cc2606e
  Description:  The software does not properly restrict the size or amount of resources that are requested or influenced by an actor, which can be used to consume more resources than intended.
  CVSS Score:  5.3
  CVSS Vector:  CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
  CVE:  undefined
  Reference:  https://ossindex.sonatype.org/vuln/00864743-f576-4ce5-a8f6-2b933cc2606e

[195/201] - pkg:npm/sjcl@1.0.7 - No vulnerabilities found!
[196/201] - pkg:npm/string.prototype.repeat@0.2.0 - No vulnerabilities found!
[197/201] - pkg:npm/symbol-observable@1.1.0 - No vulnerabilities found!
[198/201] - pkg:npm/tiny-warning@1.0.3 - No vulnerabilities found!
[199/201] - pkg:npm/typesettable@3.1.0 - No vulnerabilities found!
[200/201] - pkg:npm/xmlhttprequest@1.8.0 - No vulnerabilities found!
[201/201] - pkg:npm/xss-filters@1.2.7 - No vulnerabilities found!

(为便于阅读,结果被截断;您也可以使用 --quiet 跳过没有漏洞的软件包)

如您所见,AuditJS 提供了已扫描代码的完整清单,包括传递依赖项。如果扫描结果未发现漏洞,它将返回错误代码 0;否则,它将返回 1。如果需要,这可以作为构建过程的一部分使用。

您还可以将结果输出到 JSON 文件中:

auditjs ossi --json > file.json

或 XML

auditjs ossi --xml > file.xml

您可以在AuditJS 主页上查看有关如何在 npm 构建中包含 AuditJS 或与 Github、Travis CI、Jenkins、Travis 和其他构建工具集成的更多信息和示例项目

排除不适用的漏洞

如果您调查了某个安全漏洞,并认为它不适用于您的特定情况,您可以将其从以后的扫描中排除。您可以通过以下两种方式之一执行此操作:在项目根目录下创建一个 auditjs.json 文件,或在命令行中指向排除文件

$ auditjs ossi --whitelist /<PATH_TO>/auditjs.json

auditjs.json 文件的语法应如下所示:

{
"ignore": [{ "id": "78a61524-80c5-4371-b6d1-6b32af349043", "reason": "Insert reason here" }]
}

id 是唯一相关的字段 - 这是运行 AuditJS 后返回的漏洞 ID。reason 属性可用于指定原因或其他注释,以说明为何将此漏洞排除在未来的扫描之外。

AuditJS 与 npm audit

您可能听说过的另一个用于评估 JavaScript 项目安全漏洞的工具是 npm audit。这两个工具(以及其他类似的工具)以类似的方式评估依赖项。最大的区别始终在于它们获取漏洞的数据来源。漏洞扫描工具的优劣取决于它所扫描的数据!

替代文本

毫无疑问,我存在偏见,因为我就职于赞助OSS Index的公司Sonatype,但我相信OSS Index的数据比其他来源的数据可靠得多。这在消除误报方面尤其如此,误报指的是报告了漏洞但实际上并非问题。这些误报不仅浪费你的时间,还会导致你对审计结果失去敏感度,最终开始忽略审计结果。

有关这两个工具的更详细比较,请查看npm audit 与 auditjs 的比较

其他使用 OSS 索引的免费扫描工具

除了 AuditJS 之外,还有其他一些类似的工具使用 OSS 索引来扫描漏洞。所以,如果你精通多种编程,可以尝试一下其中一款。你可以将它们视为 AuditJS 在其他语言中的对应版本。

  • Nancy - 用于 Golang 依赖项
  • Jake - 适用于 Python / Conda 环境
  • Chelsea——适用于 RubyGem 支持的项目

超越 AuditJS - 使用 OSS Index 进行审计与使用 Nexus IQ 服务器进行审计的区别

您可能已经注意到,您可以选择针对(免费)OSS 索引或 Nexus IQ 服务器运行 AuditJS。以下是这两个选项之间的简要区别。

根据 OSS 索引审核您的应用程序可以发现大多数安全漏洞。AuditJS 会遍历您的 node_modules 目录,因此它会编译所有直接和传递依赖项的完整列表。然后,它使用“坐标”或“基于名称的匹配”与 OSS 索引进行通信,以识别漏洞。

这将捕获大多数安全漏洞,但不会捕获以下极端情况:

将存在漏洞的 jQuery 副本移动到你的项目中,并将其留在你的 lib 文件夹中(npm 不知道这一点)
将项目中的代码复制并粘贴到你的某个文件中

Nexus IQ 服务器确实有办法捕获更多类似的情况。您可以设置项目的一种方法是,在开发环境中使用 OSS 索引扫描,然后使用Nexus IQ 服务器进行审计,以获得更适用于生产的控制,包括设置审计策略的能力。

为 AuditJS 做出贡献

我希望您能将 AuditJS 视为一种有助于提高安全性并保护您的 Javascript 项目免受安全漏洞影响的方法。

AuditJS 是由 Sonatype 支持的面向 JavaScript 社区的开源项目。AuditJS 欢迎贡献者 - 请查看其 Github 页面或在AuditJS Gitter上与其他贡献者交流

鏂囩珷鏉ユ簮锛�https://dev.to/thedanmiller/how-to-keep-your-javascript-projects-safe-3jgi
PREV
位置决定一切 定位如何运作?其他属性又如何?
NEXT
探索 JavaScript 控制台对象和日志记录!