权限与安全边界
用最小权限控制文件、网络、环境变量、子进程、FFI 与动态导入
Deno 默认禁止敏感 I/O。权限属于整个执行线程,不会为每个依赖自动建立独立沙箱。
常用权限
| 能力 | 精确授权示例 |
|---|---|
| 读文件 | --allow-read=./config,./public |
| 写文件 | --allow-write=./data |
| 网络 | --allow-net=api.example.com:443 |
| 环境变量 | --allow-env=PORT,API_KEY |
| 子进程 | --allow-run=git |
| 动态导入 | --allow-import=jsr.io |
--deny-* 优先于对应的 --allow-*,可从宽授权中排除路径或主机。非交互环境用 --no-prompt,让缺失权限立即失败。
deno run \
--allow-net=api.example.com:443 \
--allow-env=API_KEY \
--no-prompt main.ts
高风险权限
-A/--allow-all关闭沙箱。--allow-run启动的外部进程不受当前 Deno 权限集约束;尤其不要让受限代码启动 shell 或新的deno -A。--allow-ffi加载原生机器码,JavaScript 层权限无法约束它的系统调用。- 初始静态模块图的加载与程序运行时 I/O 是不同边界;不要把“能 import”理解成“运行后拥有网络权限”。
验证清单
- 无权限运行一次,确认失败位置。
- 一次只增加一个受限授权。
- 在 CI 使用
--no-prompt。 - 对工具调用、插件和用户代码使用 OS/容器级隔离,不只依赖 Deno 权限。