# 权限与安全边界

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`，让缺失权限立即失败。

```bash
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”理解成“运行后拥有网络权限”。

## 验证清单

1. 无权限运行一次，确认失败位置。
2. 一次只增加一个受限授权。
3. 在 CI 使用 `--no-prompt`。
4. 对工具调用、插件和用户代码使用 OS/容器级隔离，不只依赖 Deno 权限。

官方参考：[Security and permissions](https://docs.deno.com/runtime/fundamentals/security/)、[Permissions reference](https://docs.deno.com/runtime/reference/permissions/)。
