Node.js v25.0.0 文档
- Node.js v25.0.0
- 目录
-
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲区
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入器 API
- 子进程
- 集群
- 命令行选项
- 控制台
- 加密
- 调试器
- 已弃用的 API
- 诊断通道
- DNS
- 域
- 环境变量
- 错误
- 事件
- 文件系统
- 全局对象
- HTTP
- HTTP/2
- HTTPS
- 检查器
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:包
- 模块:TypeScript
- 网络
- 操作系统
- 路径
- 性能钩子
- 权限
- 进程
- Punycode
- 查询字符串
- 逐行读取
- REPL
- 报告
- 单一可执行文件应用
- SQLite
- 流
- 字符串解码器
- 测试运行器
- 定时器
- TLS/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用工具
- V8
- 虚拟机
- WASI
- Web Crypto API
- Web Streams API
- 工作线程
- Zlib
- 其他版本
- 选项
权限#
权限可用于控制 Node.js 进程可以访问哪些系统资源,或进程可以对这些资源执行哪些操作。
- 基于进程的权限控制 Node.js 进程对资源的访问。资源可以被完全允许或拒绝,或者可以控制与其相关的操作。例如,可以允许文件系统读取,同时拒绝写入。此功能不能防止恶意代码。根据 Node.js 的安全策略,Node.js 信任其被要求运行的任何代码。
权限模型实现了一种“安全带”方法,它能防止受信任的代码意外更改文件或使用未明确授予访问权限的资源。在存在恶意代码的情况下,它不提供安全保证。恶意代码可以绕过权限模型,并在不受权限模型施加的限制下执行任意代码。
如果您发现潜在的安全漏洞,请参阅我们的安全策略。
基于进程的权限#
权限模型#
Node.js 权限模型是一种在执行期间限制对特定资源访问的机制。该 API 存在于一个标志 --permission
之后,启用该标志后,将限制对所有可用权限的访问。
可用的权限由 --permission
标志记录。
当使用 --permission
启动 Node.js 时,通过 fs
模块访问文件系统、访问网络、衍生进程、使用 node:worker_threads
、使用原生插件、使用 WASI 以及启用运行时检查器的能力都将受到限制(SIGUSR1 的监听器将不会被创建)。
$ node --permission index.js
Error: Access to this API has been restricted
at node:internal/main/run_main_module:23:47 {
code: 'ERR_ACCESS_DENIED',
permission: 'FileSystemRead',
resource: '/home/user/index.js'
}
允许访问衍生进程和创建工作线程可以通过分别使用 --allow-child-process
和 --allow-worker
来实现。
要允许网络访问,请使用 --allow-net
;在使用权限模型时要允许原生插件,请使用 --allow-addons
标志。对于 WASI,请使用 --allow-wasi
标志。
运行时 API#
当通过 --permission
标志启用权限模型时,process
对象会新增一个 permission
属性。此属性包含一个函数:
permission.has(scope[, reference])
#
用于在运行时检查权限的 API 调用 (permission.has()
)
process.permission.has('fs.write'); // true
process.permission.has('fs.write', '/home/rafaelgss/protected-folder'); // true
process.permission.has('fs.read'); // true
process.permission.has('fs.read', '/home/rafaelgss/protected-folder'); // false
文件系统权限#
权限模型默认会限制通过 node:fs
模块对文件系统的访问。它不保证用户无法通过其他方式访问文件系统,例如通过 node:sqlite
模块。
要允许访问文件系统,请使用 --allow-fs-read
和 --allow-fs-write
标志。
$ node --permission --allow-fs-read=* --allow-fs-write=* index.js
Hello world!
默认情况下,应用程序的入口点会被包含在允许的文件系统读取列表中。例如:
$ node --permission index.js
index.js
将被包含在允许的文件系统读取列表中。
$ node -r /path/to/custom-require.js --permission index.js.
/path/to/custom-require.js
将被包含在允许的文件系统读取列表中。index.js
将被包含在允许的文件系统读取列表中。
这两个标志的有效参数是:
*
- 分别允许所有FileSystemRead
或FileSystemWrite
操作。- 相对于当前工作目录的路径。
- 绝对路径。
示例
--allow-fs-read=*
- 将允许所有FileSystemRead
操作。--allow-fs-write=*
- 将允许所有FileSystemWrite
操作。--allow-fs-write=/tmp/
- 将允许对/tmp/
文件夹的FileSystemWrite
访问。--allow-fs-read=/tmp/ --allow-fs-read=/home/.gitignore
- 允许对/tmp/
文件夹 和/home/.gitignore
路径的FileSystemRead
访问。
同样支持通配符:
--allow-fs-read=/home/test*
将允许对所有匹配通配符的内容进行读取访问。例如:/home/test/file1
或/home/test2
。
在传递通配符(*
)之后,所有后续字符都将被忽略。例如:/home/*.js
的作用将类似于 /home/*
。
当权限模型初始化时,如果指定的目录存在,它将自动添加一个通配符 (*)。例如,如果 /home/test/files
存在,它将被视为 /home/test/files/*
。但是,如果目录不存在,则不会添加通配符,访问权限将仅限于 /home/test/files
。如果你想允许访问一个尚不存在的文件夹,请务必明确包含通配符:/my-path/folder-do-not-exist/*
。
配合 npx
使用权限模型#
如果你使用 npx
来执行 Node.js 脚本,你可以通过传递 --node-options
标志来启用权限模型。例如:
npx --node-options="--permission" package-name
这会为所有由 npx
衍生的 Node.js 进程设置 NODE_OPTIONS
环境变量,而不会影响 npx
进程本身。
使用 npx
时的 FileSystemRead 错误
上述命令很可能会抛出一个 FileSystemRead
无效访问错误,因为 Node.js 需要文件系统读取权限来定位和执行包。为了避免这种情况:
-
使用全局安装的包 通过运行以下命令授予对全局
node_modules
目录的读取权限:npx --node-options="--permission --allow-fs-read=$(npm prefix -g)" package-name
-
使用
npx
缓存 如果你是临时安装包或依赖npx
缓存,请授予对 npm 缓存目录的读取权限:npx --node-options="--permission --allow-fs-read=$(npm config get cache)" package-name
你通常传递给 node
的任何参数(例如,--allow-*
标志)也可以通过 --node-options
标志传递。这种灵活性使得在使用 npx
时可以轻松地按需配置权限。
权限模型约束#
在使用此系统之前,你需要了解一些约束:
- 该模型不会继承到工作线程(worker thread)。
- 当使用权限模型时,以下功能将受到限制:
- 原生模块
- 网络
- 子进程 (Child process)
- 工作线程
- 检查器协议
- 文件系统访问
- WASI
- 权限模型在 Node.js 环境设置之后初始化。然而,某些标志如
--env-file
或--openssl-config
被设计为在环境初始化之前读取文件。因此,这些标志不受权限模型规则的约束。同样的情况也适用于可以通过v8.setFlagsFromString
在运行时设置的 V8 标志。 - 当启用权限模型时,不能在运行时请求 OpenSSL 引擎,这会影响内置的 crypto、https 和 tls 模块。
- 当启用权限模型时,无法加载运行时可加载扩展,这会影响 sqlite 模块。
- 通过
node:fs
模块使用现有文件描述符会绕过权限模型。
限制和已知问题#
- 符号链接将被跟踪,即使它们指向了已授予访问权限的路径集合之外的位置。相对符号链接可能允许访问任意文件和目录。在使用权限模型启用应用程序时,你必须确保所有已授予访问权限的路径都不包含相对符号链接。