Node.js Permission Model 怎样限制运行时文件访问
如果一个 Node.js 程序只需要读配置、写缓存,却能顺手访问进程所在机器上的其他文件,可以用 Permission Model 把运行时文件访问收窄到明确目录。官方入口:https://nodejs.org/api/permissions.html。
核心做法是用 --permission 开启默认拒绝,再分别用 --allow-fs-read 和 --allow-fs-write 授权路径。它更像防止可信代码误操作的“安全带”,不是用来承诺恶意代码绝对无法绕过的完整沙箱。
一、先理解 --permission 的默认文件访问边界
启动 Node.js 时加入 --permission,文件系统访问会进入权限检查。应用的入口文件会自动加入允许读取列表,所以 node --permission app.js 可以先加载 app.js;除此之外,代码读取未授权文件时会得到 ERR_ACCESS_DENIED。
这个默认值很重要:它不是“所有文件都能读、只限制写入”,而是先限制文件系统,再按任务补充授权。网络、子进程、Worker、原生插件、WASI、FFI 和 Inspector 等能力也会受到 Permission Model 影响,本文只展开文件读写。
二、用两个参数分别授权读取和写入
假设程序需要读取 ./config 下的配置,并把运行数据写入 ./data,启动命令可以写成:
# 只开放配置目录的读取和数据目录的写入 node --permission \ --allow-fs-read=./config \ --allow-fs-write=./data \ app.js
--allow-fs-read 和 --allow-fs-write 是两套独立范围:能读不代表能写,能写也不代表能读。路径可以使用相对当前工作目录的路径、绝对路径或 *;例如 --allow-fs-write=/tmp/ 只把写入范围交给该目录。生产启动脚本应优先写出实际目录,而不是直接使用全量通配符。
如果程序确实要访问一个尚不存在的目录,路径末尾应显式带上通配符,例如 --allow-fs-read=/srv/app/cache/*;Node.js 文档说明,对于已经存在的目录,初始化时可能自动补成目录通配范围,而不存在的目录不会自动补这个通配符。

三、把权限清单放进配置文件
命令行参数较多时,可以使用 --config-file 读取 Node.js 配置文件。权限项放在顶层 permission 对象中:
{
"permission": {
"allow-fs-read": ["./config"],
"allow-fs-write": ["./data"],
"allow-child-process": false,
"allow-worker": false,
"allow-net": false
}
}
保存为 node.config.json 后,用下面的命令启动:
# 配置文件中的 permission 节点会自动启用权限模型 node --config-file=node.config.json app.js
JSON 不能写注释,因此字段旁边的说明要放在文档或配置说明里;不要为了注释破坏 JSON 格式。配置文件的好处是可以把读写目录和其他能力开关一起提交审查,减少启动脚本被多处复制后出现权限漂移。

四、权限收窄后最容易忽略的边界
第一,--permission 不是恶意代码沙箱。官方文档明确 Node.js 信任被要求执行的代码,Permission Model 主要用于避免可信代码意外改文件或使用未显式授予的资源。
第二,符号链接需要单独检查。文档提示,已授权路径中的相对符号链接可能指向授权目录之外的位置;给应用开放目录前,要确认目录里没有把访问范围引向其他位置的相对链接。
第三,已经打开的文件描述符、网络连接或子进程不会因为后续权限变化自动关闭。运行时 API process.permission.drop() 只能影响未来的权限检查,资源生命周期仍要由应用自己关闭或终止。
最后,用 --permission-audit 可以先观察哪些权限检查会被触发而不拒绝访问,再把整理后的最小目录清单切换到 --permission。判断配置是否合适时,重点看“程序实际需要读写哪些目录”,不要把整个工作目录一股脑授权。
常见问题
为什么入口文件能读,旁边的 JSON 却读不到?入口文件会被自动加入允许读取列表,其他文件仍需通过 --allow-fs-read 或配置文件授权。
只允许写入目录时是否也要允许读取?读写是分开的。如果程序在写入前还要读取旧文件、读取目录内容或读取配置,就要单独授予读取范围。
能不能把 Permission Model 当作执行不可信脚本的隔离层?不能。它适合减少可信应用的意外资源访问;面对恶意代码,还需要操作系统级隔离和独立运行身份等边界。
总结:先用 --permission 把文件访问设为默认拒绝,再按“配置只读、数据可写”的任务拆分授权,最后用配置文件固定清单并检查符号链接、已打开资源和模型自身限制。
GitHub Actions artifact attestations 怎样在工作流中生成 SBOM 证明
- 上一篇
- GitHub Actions artifact attestations 怎样在工作流中生成 SBOM 证明
- 下一篇
- Python 3.14 新增解释器优化如何影响部署
-
- 科技周边 · 业界新闻 | 24分钟前 |
- Docker Buildx 怎样把多平台镜像一次推送到仓库
- 123浏览 收藏
-
- 科技周边 · 业界新闻 | 28分钟前 | Kafka · Apache Kafka KRaft 集群元数据 controller quorum
- Apache Kafka KRaft 模式怎样管理集群元数据
- 125浏览 收藏
-
- 科技周边 · 业界新闻 | 30分钟前 |
- PostgreSQL 逻辑复制怎样按表选择发布内容
- 170浏览 收藏
-
- 科技周边 · 业界新闻 | 30分钟前 |
- Sigstore Cosign 怎样验证容器镜像签名
- 331浏览 收藏
-
- 科技周边 · 业界新闻 | 34分钟前 |
- Rust 2024 Edition 怎样准备项目迁移
- 307浏览 收藏
-
- 科技周边 · 业界新闻 | 35分钟前 | 云原生 · 软件供应链 CNCF TAG App Delivery 云原生应用交付
- CNCF TAG App Delivery 怎样理解供应链交付边界
- 161浏览 收藏
-
- 科技周边 · 业界新闻 | 41分钟前 | 可观测性 · 内存限制 OpenTelemetry Collector memory_limiter
- OpenTelemetry Collector memory_limiter 限制内存峰值的配置方法
- 344浏览 收藏
-
- 科技周边 · 业界新闻 | 47分钟前 |
- Go 1.25 testing/synctest 正式可用后怎么测试并发
- 130浏览 收藏
-
- 科技周边 · 业界新闻 | 49分钟前 |
- Python 3.14 新增解释器优化如何影响部署
- 416浏览 收藏
-
- 科技周边 · 业界新闻 | 52分钟前 |
- GitHub Actions artifact attestations 怎样在工作流中生成 SBOM 证明
- 497浏览 收藏
-
- 科技周边 · 业界新闻 | 54分钟前 | kubernetes · 业界新闻 · Kubernetes Gateway API HTTPRoute 请求头分流
- Kubernetes Gateway API 怎样用 HTTPRoute 按请求头分流
- 284浏览 收藏
-
- 科技周边 · 业界新闻 | 16小时前 |
- GitHub 移动端处理紧急修复的权限边界
- 123浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 764次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 760次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 842次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 813次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 641次使用
-
- 从Node.js 转到 Go平台
- 2022-12-23 482浏览
-
- Go 用 io/fs 做配置目录快照:过滤、排序与差异报告小工具
- 2026-07-24 339浏览
-
- Go io/fs.ValidPath 为什么拒绝 ./config.yaml:FS 路径规则与迁移边界
- 2026-07-24 388浏览
-
- Go io/fs.ReadDir 如何避免目录遍历顺序误判:排序约定、错误处理与测试边界
- 2026-08-26 253浏览
-
- Go os.OpenRoot 怎么限制用户路径:安全打开、目录逃逸与错误验收
- 2026-08-26 182浏览

