菜单

权限系统

相关源文件

Deno 的权限系统提供了一个安全模型,通过显式的权限授予来控制对系统资源的访问。本文档涵盖了核心权限类型、状态管理、描述符解析、用户提示机制以及与运行时操作的集成。有关 CLI 标志解析和权限配置的信息,请参阅 命令处理

权限模型概述

Deno 的权限系统基于显式同意的原则运作,对系统资源的访问需要通过 CLI 标志预先授予权限,或通过交互式提示获得用户同意。该系统支持文件系统访问、网络操作、环境变量、系统信息、子进程执行和外部函数接口 (FFI) 操作的细粒度权限。

来源:runtime/permissions/lib.rs674-1663 runtime/permissions/lib.rs83-93

权限状态和描述符

权限系统使用四状态模型来表示权限状态。每种权限类型都实现了 QueryDescriptor trait,从而能够对不同资源类型进行统一的权限检查。

权限状态转换

PermissionState 枚举定义了四种不同的状态

  • Granted:对请求资源的完全访问权限
  • GrantedPartial:已授予访问权限,但通过 deny 标志拒绝了部分权限
  • Prompt:需要用户同意(默认状态)
  • Denied:明确拒绝访问

来源:runtime/permissions/lib.rs83-93 runtime/permissions/lib.rs161-216

QueryDescriptor 架构

来源:runtime/permissions/lib.rs331-357 runtime/permissions/lib.rs694-753 runtime/permissions/lib.rs924-993

权限容器架构

UnaryPermission<TQuery> 结构是管理特定类型权限的核心容器,它在全局和细粒度级别上维护已授予权限和已拒绝权限的单独列表。

UnaryPermission 结构

来源:runtime/permissions/lib.rs367-672 runtime/permissions/lib.rs458-490

权限检查算法

权限检查过程遵循分层评估

  1. 拒绝检查:首先检查访问是否通过标志或先前的用户拒绝被明确拒绝
  2. 授予检查:评估访问是全局授予还是通过特定描述符授予
  3. 部分评估:确定是否有任何拒绝规则会造成部分访问限制
  4. 默认状态:如果没有显式的授予或拒绝,则返回 Prompt

来源:runtime/permissions/lib.rs458-490 runtime/permissions/lib.rs551-589

权限解析和验证

RuntimePermissionDescriptorParser 负责将基于字符串的权限规范转换为类型化描述符,并进行验证和路径解析。

描述符解析器架构

来源:runtime/permissions.rs24-174 runtime/permissions.rs45-64

网络描述符解析

网络权限支持各种格式,包括 IPv4/IPv6 地址、带可选端口的域名以及子域通配符

来源:runtime/permissions/lib.rs924-1147 runtime/permissions/lib.rs830-921

权限提示系统

当代码尝试在未事先获得授权的情况下访问受保护资源时,提示系统会提供交互式权限请求。

Prompter 架构

来源:runtime/permissions/prompter.rs59-76 runtime/permissions/lib.rs161-216 runtime/permissions/prompter.rs312-506 runtime/permissions/prompter.rs121-283

权限提示安全特性

TtyPrompter 实现了多项安全措施,以防止绕过权限提示

  1. 输入验证:在提示前后清除 stdin,以防止预缓冲的输入
  2. 终端验证:确保 stdin 和 stderr 都是终端
  3. 文件描述符监控:在 Unix 系统上,验证 stdin 在提示期间未被替换
  4. 消息长度限制:限制提示消息的长度,以防止溢出攻击
  5. 控制字符转义:使控制字符可见,以防止隐藏内容

来源:runtime/permissions/prompter.rs312-506 runtime/permissions/prompter.rs121-283

与运行时操作集成

权限系统通过 PermissionsContainer 和用于权限查询、请求和撤销的专用操作与 Deno 的操作层集成。

运行时权限操作

来源:runtime/ops/permissions.rs67-125 runtime/ops/permissions.rs19-46

Worker 线程权限继承

Worker 线程会继承其父上下文的权限,并可通过 ChildPermissionsArg 进行可选修改

来源: runtime/permissions/lib.rs627-671 runtime/ops/worker_host.rs172-181 ext/node/polyfills/worker_threads.ts117-181