菜单

核心原则

相关源文件

本文档涵盖了指导 Deno 架构的基本设计原则和安全模型。这些原则塑造了 Deno 在运行时安全性、API 设计和系统隔离方面的处理方式。

有关权限系统的详细实现,请参阅 权限系统。有关项目代码组织和模块结构的信息,请参阅 项目结构。有关 worker 隔离实现细节,请参阅 Web Workers

默认安全

Deno 的基本原则是,代码默认应在安全的沙箱中运行,没有任何环境权限。程序必须明确请求访问系统资源的权限,用户也必须明确授予。

权限系统通过几个层来强制执行此规则:

  • 权限描述符:每种资源类型都有特定的描述符类型,如 ReadDescriptorWriteDescriptorNetDescriptor,用于编码访问模式。
  • 细粒度控制:权限可以限定到特定的路径、主机或环境变量,而不是全局授予。
  • 交互式提示:当代码请求未经授权的访问时,用户会收到详细的提示,说明正在请求的内容。
  • 提示安全性:权限提示系统包含安全措施,以防止篡改并确保用户知情。

来源:runtime/permissions/lib.rs1-1499 runtime/permissions/prompter.rs1-548

Web 标准一致性

Deno 优先考虑与 Web 平台 API 的兼容性,实现标准接口而不是发明新接口。这一原则确保了知识和代码可以在浏览器和服务器环境之间转移。

实现的关键 Web 标准包括:

  • Fetch API:完整的 HTTP 客户端实现,包含 RequestResponsefetch()
  • Streams APIReadableStreamWritableStreamTransformStream,用于可组合的 I/O。
  • Web Crypto:通过 crypto.subtle 接口进行加密操作。
  • 文本编码TextEncoderTextDecoder,用于字符串/二进制转换。
  • 消息传递MessagePortMessageChannel,用于结构化数据传输。
  • 定时器setTimeoutsetInterval 和其他标准定时器 API。

来源:ext/web/lib.rs1-424 ext/web/08_text_encoding.js1-421 ext/web/13_message_port.js1-515

安全隔离模型

Deno 通过其 worker 系统和权限模型实现了不同执行上下文之间的强大隔离边界。

Worker 隔离架构

隔离模型提供了几项保证:

  • 内存隔离:每个 worker 都在一个独立的线程中运行,拥有自己的 V8 isolates。
  • 权限隔离:Worker 继承或接收其父级受限的权限。
  • 通信边界:所有 worker 之间的通信都通过序列化消息传递进行。
  • 资源隔离:Worker 维护独立的资源表,无法直接访问彼此的资源。

来源:runtime/ops/worker_host.rs1-408 ext/node/polyfills/worker_threads.ts1-661

基于权限的访问控制

权限系统基于能力安全模型运行,其中每个操作都必须经过显式授权。

权限状态机

权限描述符类型

权限类型描述符类范围示例
文件读取ReadDescriptor/home/user/docs
文件写入WriteDescriptor/tmp/output.txt
网络NetDescriptorapi.example.com:443
环境EnvDescriptorHOME, PATH*
系统信息SysDescriptorosRelease, hostname
子进程AllowRunDescriptor/usr/bin/git
FFIFfiDescriptor./native.so

权限系统支持多种高级功能:

  • 通配符模式:环境变量可以使用 NODE_* 等模式。
  • 子域通配符:网络权限可以覆盖 *.example.com
  • 路径层级:文件权限尊重目录边界。
  • 部分授权:某些权限可以部分授权,并带有限制。

来源:runtime/permissions/lib.rs674-1499 runtime/ops/permissions.rs1-126

消息传递与结构化通信

Deno 通过结构化消息传递而非共享内存来强制执行安全的通信模式。

消息序列化流程

消息传递系统提供:

  • 结构化克隆:使用结构化克隆算法序列化 JavaScript 值。
  • 可转移对象ArrayBufferMessagePort 对象可以被转移而不是复制。
  • 类型安全:所有消息都经过序列化/反序列化,防止内存损坏。
  • 隔离边界:不同执行上下文之间没有直接的内存共享。

来源:ext/web/13_message_port.js400-515 ext/web/message_port.rs1-275

运行时安全架构

整体安全架构将所有这些原则整合到一个连贯的系统中。

该架构确保:

  • 所有系统访问都通过权限系统进行。
  • Web API 提供熟悉、标准化的接口。
  • 操作由安全的 ops 层进行中介。
  • 用户通过提示和策略控制资源访问。

来源:runtime/permissions.rs1-198 runtime/permissions/prompter.rs59-506