本文档涵盖了指导 Deno 架构的基本设计原则和安全模型。这些原则塑造了 Deno 在运行时安全性、API 设计和系统隔离方面的处理方式。
有关权限系统的详细实现,请参阅 权限系统。有关项目代码组织和模块结构的信息,请参阅 项目结构。有关 worker 隔离实现细节,请参阅 Web Workers。
Deno 的基本原则是,代码默认应在安全的沙箱中运行,没有任何环境权限。程序必须明确请求访问系统资源的权限,用户也必须明确授予。
权限系统通过几个层来强制执行此规则:
ReadDescriptor、WriteDescriptor、NetDescriptor,用于编码访问模式。来源:runtime/permissions/lib.rs1-1499 runtime/permissions/prompter.rs1-548
Deno 优先考虑与 Web 平台 API 的兼容性,实现标准接口而不是发明新接口。这一原则确保了知识和代码可以在浏览器和服务器环境之间转移。
实现的关键 Web 标准包括:
Request、Response 和 fetch()。ReadableStream、WritableStream 和 TransformStream,用于可组合的 I/O。crypto.subtle 接口进行加密操作。TextEncoder 和 TextDecoder,用于字符串/二进制转换。MessagePort 和 MessageChannel,用于结构化数据传输。setTimeout、setInterval 和其他标准定时器 API。来源:ext/web/lib.rs1-424 ext/web/08_text_encoding.js1-421 ext/web/13_message_port.js1-515
Deno 通过其 worker 系统和权限模型实现了不同执行上下文之间的强大隔离边界。
隔离模型提供了几项保证:
来源:runtime/ops/worker_host.rs1-408 ext/node/polyfills/worker_threads.ts1-661
权限系统基于能力安全模型运行,其中每个操作都必须经过显式授权。
| 权限类型 | 描述符类 | 范围示例 |
|---|---|---|
| 文件读取 | ReadDescriptor | /home/user/docs |
| 文件写入 | WriteDescriptor | /tmp/output.txt |
| 网络 | NetDescriptor | api.example.com:443 |
| 环境 | EnvDescriptor | HOME, PATH* |
| 系统信息 | SysDescriptor | osRelease, hostname |
| 子进程 | AllowRunDescriptor | /usr/bin/git |
| FFI | FfiDescriptor | ./native.so |
权限系统支持多种高级功能:
NODE_* 等模式。*.example.com。来源:runtime/permissions/lib.rs674-1499 runtime/ops/permissions.rs1-126
Deno 通过结构化消息传递而非共享内存来强制执行安全的通信模式。
消息传递系统提供:
ArrayBuffer 和 MessagePort 对象可以被转移而不是复制。来源:ext/web/13_message_port.js400-515 ext/web/message_port.rs1-275
整体安全架构将所有这些原则整合到一个连贯的系统中。
该架构确保:
来源:runtime/permissions.rs1-198 runtime/permissions/prompter.rs59-506