跳至主要内容
Deno 2 终于发布了 🎉️
了解更多
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 类似于此,因为它将控制权交到您的手中。当执行第三方不受信任的代码或随机依赖项时,您会知道它需要访问什么。

下一步是什么?

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

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