跳到主要内容
Deno is secure by default.

使用 Deno 通过 npm 构建更安全的 Web

npm 使软件易于访问和使用,促进了 JavaScript 社区的增长和丰富。然而,由于 Node 通过授予对文件系统、环境、互联网等的完全访问权限来安装和运行依赖项,因此 Node 程序更容易受到供应链攻击。

供应链攻击并不新鲜。但鉴于 npm 注册表是世界上最大的注册表,越来越多的 JavaScript 开发人员使用它来构建应用程序和网站,npm 始终是这些依赖项攻击的目标。

Deno 使 npm 变得更好,并且使用它进行构建更加安全,因为 Deno 默认安全且独特的沙箱架构有助于缓解基于依赖项的攻击。

默认安全

据报道,恶意 npm 模块从表单中窃取用户数据执行 shell 注入攻击以及将恶意软件安装到您的机器上。这些攻击在 Node 中更可能发生,因为 Node 应用程序(及其依赖项)都可以不受限制地访问所有内容——文件系统、互联网、环境变量等。

以下是使用 bin 脚本混淆进行的一次特别险恶的 shell 注入攻击的演示

a demo of a bin injection attack in node
Node 中的 bin 注入攻击。最初由 Socket.dev 报道

Deno 在沙箱中运行代码,并使用“选择加入”权限模型。这意味着除非您明确启用它,否则使用 Deno 运行的程序没有文件、网络或环境访问权限。访问需要通过命令行标志或运行时权限提示授予权限


gif of deno asking the user for permissions

有关权限的完整列表,请参见此处。

当您使用 Deno 运行脚本时,您会意识到它需要什么访问权限。

沙箱架构

Deno 的权限模型之所以成功,是因为程序在沙箱中执行,沙箱只有一个狭窄的入口点,几乎没有与外部系统的 API。这使得管理进出代码的所有数据变得容易。

Diagram of Deno sandbox
进入 V8 沙箱的入口点只有几个 API,这使得审计它需要访问的内容变得容易。

如同浏览器

Deno 的安全系统借鉴了现代浏览器的隐私模型。

每当您的浏览器需要访问您的网络摄像头、麦克风甚至地理位置 API 时,它都会提示您请求权限。这意味着(理论上)您完全了解您访问的网站对您计算机的访问权限。

Deno 与此类似,它将控制权掌握在您手中。当执行第三方、不受信任的代码或随机依赖项时,您会意识到它需要什么访问权限。

下一步是什么?

能够安全地浏览网络对其增长和使用至关重要。借助 Deno,通过 npm 构建更安全的 Web 变得更加容易,其沙箱化、选择加入的权限方法有助于缓解供应链攻击。

您正在使用 Deno 构建什么?请在 TwitterDiscord 上告诉我们!