在现代 web 应用技术领域,JavaScript 已经成为了一种广泛被使用的编程语言。因此,开发人员需要针对 JavaScript 进行各种操作。目前,Node.js 是其中一种流行的 JavaScript 运行环境,但是随之而来的问题是我们需要面对各种隐患和安全威胁。这时候,Deno 就成为了一个受到广泛关注的替代品。在本文中,我们会详细探讨使用 Deno 的好处和优势,以及如何使用它来建立更加安全的 JavaScript 应用程序。
Deno 是什么?
Deno 是一个新的 JavaScript 运行时环境,由 Node.js 的创建者 Ryan Dahl 开发。它的目标是为 JavaScript 应用程序提供一个更加安全的运行环境。相对于 Node.js,Deno 实现了一些额外的安全特性,例如消除了 npm 中存在的一些安全问题。
基本安全特性
Deno 具有许多优秀的安全特性,以下是其中的一些:
1. 直接支持 ES 模块
Deno 不需要使用 package.json 来跟踪模块,而且同时支持现代 ES 模块和 CommonJS 模块。这消除了在 Node.js 上安装和更新时出现的许多安全隐患。Deno 还支持直接基于 URL 引用来加载模块,这意味着你可以在代码中直接链接第三方依赖。例如:
-- -------------------- ---- ------- ------ - ----- - ---- --------------------------------------- ----- ------ - ------- ----- ---- --- -------------------------------------- --- ----- ------ --- -- ------- - ------------- ----- ------ -------- --- -
这个代码片段将会引入 deno.land
上的一个远程 HTTP 服务器模块,并使用 serve
函数来创建一个本地服务器。在这里,我们直接通过 URL 加载模块,而且无需在代码中指定其版本号。这样做带来的最明显的好处是我们无需通过 package.json 来跟踪模块,否则我们需要自己处理这个工作并需要较高的技术水平才能避免安全问题。
2. 明确的权限模型
不同于 Node.js,Deno 采用了明确的权限模型,即程序必须指定它需要的权限。这就避免了因应用程序错误引入恶意代码而导致的安全漏洞产生。
例如,下面的代码使用了 Deno 的文件系统 API 来根据文件路径读取文件内容:
const file = await Deno.open('/path/to/file'); const content = new TextDecoder().decode(await Deno.readAll(file)); Deno.close(file.rid); console.log(content);
在这里,我们通过 Denp.open()
和 Deno.readAll()
函数打开并读取一个文件。但是,在 open()
函数中,我们并没有指定读取文件时的权限,因此将导致权限不足错误。在实际开发时,我们需要明确指定程序所需权限,例如:
const file = await Deno.open('/path/to/file', { read: true }); const content = new TextDecoder().decode(await Deno.readAll(file)); Deno.close(file.rid); console.log(content);
这样做是为了保证我们在运行代码时不会出现意外行为,而且可以防止恶意代码进入应用程序。
3. 默认禁止网络访问和文件系统访问
Deno 的另一个安全特性是默认禁止程序进行网络访问和文件系统访问。如果您需要访问网络或文件系统,需要相应授权。例如:
const worker = new Worker(new URL('worker.js', import.meta.url).href, { type: 'module', deno: { permissions: 'read' }, });
这里,我们创建了一个Worker,并且通过URL构造器来加载 worker.js文件。另外,我们使用了 deno 这个特殊的键来指定适当的许可证。在这里,我们要求程序有一个读取文件系统文件的权限。如果未进行这样的检查,攻击者将有可能访问一些应用程序数据,这显然是不安全的。
4. 内建 TypeScript 支持
Deno 内置支持 TypeScript,这允许我们编写更加类型安全的 JavaScript 代码。与 JavaScript 相比,TypeScript 具有更多的类型检查和错误处理,以减少由类型错误和语法错误引起的潜在安全问题。
Deno vs Node.js 安全性
与 Node.js 相比,Deno 有许多优秀的安全特性。以下是其中的主要区别:
CommonJS 模块与 ES 模块
在 Node.js 中,共享包管理器 npm 并且支持 CommonJS 和 ES 模块。这允许我们通过npm来轻松管理大量现成的第三方库,但同时增加了安全问题,例如闭包攻击。与之不同的是,在 Deno 中,不支持 npm,而是直接从模块 URL 引入模块,消除了类似闭包攻击、代码注入等常见安全问题。
Deno 提供明确的许可证模型
在 Node.js 中,默认开启的权限可能会引起潜在的安全风险。当使用某些 packages 时,我们需要相应的权限保护措施,例如设置访问权限和限制环境变量。而在 Deno 中,我们需要在程序运行时获取相应权限,这样就排除了默认开启的权限可能会引起的安全风险。
Deno 自动检测代码进行安全性检查
Deno 内置安全检查机制,自动检测应用程序可能存在的安全隐患。这可以有效地帮助我们识别并排除应用程序中的潜在安全漏洞。
结论
虽然 Deno 是一项相对较新的技术,但它已经被证明是一个比 Node.js 更加安全的 JavaScript 运行环境。拥有许多额外的安全特性,Deno 可以帮助我们构建更加健壮和安全的 JavaScript 应用程序。
除此之外,Deno 还提供了许多其他有用的功能和工具,例如 TypeScript 支持,与浏览器和 Web Workers 的集成,等等。同时,由于无需依赖于 npm,Deno 可以大大简化我们的应用程序开发流程,避免了 Node.js 中许多额外的安全风险。
在开发 JavaScript 应用程序时,我们应该优先选择使用 Deno,而不是 Node.js。这将帮助我们建立更加安全性程序,减少潜在的安全隐患和恶意代码攻击。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67131980ad1e889fe20a8a9c