
node.js v20引入了实验性权限模型,旨在增强应用安全性。启用该模型需使用--experimental-permission标志,此时所有资源访问默认受限。文章将详细介绍如何启用权限模型、配置文件系统读写权限(包括通配符和特定路径),并解析typeerror: cannot read properties of undefined和err_access_denied等常见错误及其解决方案,帮助开发者有效管理node.js应用的资源访问。
Node.js v20及更高版本引入了一个实验性的权限模型,其核心目标是为应用程序提供更细粒度的资源访问控制。这使得开发者能够明确指定其Node.js进程可以访问哪些文件、网络资源或其他API,从而显著提升应用的安全性,尤其是在处理不受信任的代码或构建沙箱环境时。该模型通过process.permission API提供运行时权限检查能力。
要使用Node.js的权限模型,必须在启动Node.js进程时显式启用一个命令行标志。
通过在运行命令中添加--experimental-permission标志来启用权限模型:
node --experimental-permission your-app.js
重要提示:当--experimental-permission标志被启用时,Node.js进程将默认拒绝所有权限,除非显式授权。
如果在没有启用--experimental-permission标志的情况下尝试访问process.permission对象,将会遇到TypeError。这是因为process.permission对象仅在权限模型被激活时才存在。
示例代码 (app.js):
// app.js
console.log(process.permission.has("fs.read"));未启用权限模型时的运行与错误:
$ node app.js
错误输出:
console.log(process.permission.has("fs.read"));
^
TypeError: Cannot read properties of undefined (reading 'has')
at file:///home/stanley/example-app/app.js:1:32
# ... (rest of stack trace)解析:此错误表明process.permission在当前上下文中是undefined,因此无法调用其has方法。解决方案是务必在运行Node.js程序时加上--experimental-permission标志。
一旦权限模型被启用,Node.js进程将默认受到严格限制。为了允许应用程序执行特定的操作,例如文件读写,需要使用特定的--allow-*标志来授予权限。
Node.js提供了--allow-fs-read和--allow-fs-write标志来控制文件系统的访问。
授予所有文件系统读权限: 使用--allow-fs-read=*可以允许进程读取任何文件。
授予所有文件系统写权限: 使用--allow-fs-write=*可以允许进程写入任何文件。
授予特定文件或目录的权限: 您可以指定一个逗号分隔的绝对路径列表,以限制对特定文件或目录的访问。 例如:--allow-fs-read=/path/to/file1,/path/to/directory2
重要提示:在指定特定路径时,必须使用绝对路径。相对路径当前不受支持,使用相对路径会导致权限检查失败。
当权限模型启用后,如果尝试执行一个未被明确授权的操作,Node.js将抛出ERR_ACCESS_DENIED错误。
示例场景:启用权限模型但未授予文件系统读权限。
LALAL.AI
AI人声去除器和声乐提取工具
196
查看详情
$ node --experimental-permission app.js
错误输出:
node:internal/modules/cjs/loader:179
const result = internalModuleStat(filename);
^
Error: Access to this API has been restricted
at stat (node:internal/modules/cjs/loader:179:18)
# ... (rest of stack trace)
{
code: 'ERR_ACCESS_DENIED',
permission: 'FileSystemRead',
resource: '/home/stanley/example_app/app.js'
}解析:此错误清晰地表明,当前进程没有执行FileSystemRead操作的权限,并且尝试访问的资源是/home/stanley/example_app/app.js。
让我们通过一个具体的例子来演示如何结合使用权限模型和文件系统权限标志。
首先,创建两个文件:index.js(主程序)和 a.json(将被读取的数据)。
a.json:
{
"name": "lin"
}index.js:
const fs = require('fs');
const path = require('path');
// 检查当前进程是否具有文件系统读写权限
console.log('Has fs.read permission?', process.permission.has("fs.read"));
console.log('Has fs.write permission?', process.permission.has("fs.write"));
// 尝试读取 a.json
try {
const jsonData = fs.readFileSync(path.resolve(__dirname, './a.json'), 'utf-8');
console.log('JSON content:', jsonData);
} catch (error) {
console.error('Error reading a.json:', error.message);
}
// 尝试写入 b.json
try {
fs.writeFileSync(path.resolve(__dirname, './b.json'), JSON.stringify({ status: 'ok' }));
console.log('b.json written successfully.');
} catch (error) {
console.error('Error writing b.json:', error.message);
}现在,我们运行index.js,只授予所有文件系统读权限,但不授予写权限:
node --experimental-permission --allow-fs-read=* index.js
预期输出:
Has fs.read permission? true
Has fs.write permission? false
JSON content: {
"name": "lin"
}
Error writing b.json: Access to this API has been restricted分析:
假设我们只想允许index.js读取a.json和index.js本身,同时不授予写权限。 首先,获取a.json和index.js的绝对路径(请根据您的实际环境修改):
# 假设您的文件位于 /home/user/nodejs-app/
# 实际运行时请替换为您的绝对路径
NODE_APP_PATH=$(pwd)/index.js
A_JSON_PATH=$(pwd)/a.json
node --experimental-permission \
--allow-fs-read=${A_JSON_PATH},${NODE_APP_PATH} \
index.js预期输出(与上述类似,因为写权限仍未授予):
Has fs.read permission? true
Has fs.write permission? false
JSON content: {
"name": "lin"
}
Error writing b.json: Access to this API has been restricted分析:即使我们只指定了a.json和index.js的读权限,process.permission.has("fs.read")仍然返回true,因为它检查的是通用的fs.read能力。如果尝试读取未授权的文件,则会抛出ERR_ACCESS_DENIED。fs.writeFileSync依然失败,因为没有授予写权限。
通过理解和正确配置Node.js权限模型,开发者可以构建更安全、更健壮的Node.js应用程序,有效抵御潜在的恶意行为或意外的资源访问。随着该模型的不断成熟,它将成为Node.js生态系统中一个不可或缺的安全特性。
以上就是Node.js 实验性权限模型:启用、配置与常见错误解析的详细内容,更多请关注其它相关文章!
# 不受
# 冷库机组网站建设规范
# 无锡seo网络推广平台
# 品牌seo优化资质
# 日照互联网seo技巧
# 武陟县营销推广公司
# 个体户 网站建设 住宅
# 渭南制造业网站优化排名
# 公众营销推广
# 维护网站建设银行
# 临城抖音关键词排名系统
# 如何正确
# 如何解决
# 将被
# nodejs
# 所需
# 抛出
# 应用程序
# 您的
# 文件系统
# 配置文件
# 工具
# access
# app
# node
# json
# node.js
# js
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法
使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel
海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接
word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法
如何在mysql中比较InnoDB和MyISAM区别
CSS如何控制元素外边距_margin实现布局间隔
画质怪兽120帧安卓和平精英免费版
如何查询个人病历记录
VB表达式书写规则解析
Highcharts雷达图轴线交点数值标注指南
在PySimpleGUI中实现键盘按键绑定按钮事件
Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题
Retrofit根路径POST请求:@POST("/") 的应用与解析
Flash AS3.0简易相册制作
抖音商城官网是什么_抖音商城官方网址与访问方法
Animex动漫社正版在线入口 Animex动漫社动漫官方观看网
百度输入法在AutoCAD中无法输入中文怎么办_百度输入法CAD输入异常解决方法
PHP安全加载非公开目录图片与动态内容类型处理指南
手机远程连接电脑方法
Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】
ao3入口镜像地址 ao3镜像入口可靠跳转
edge浏览器怎么修改语言为中文_Edge界面语言切换教程
漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口
包子漫画在线观看入口 包子漫画网正版全集链接
电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】
C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树
TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法
无人机考证官网 中国民航无人机考证官网登录入口
抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口
Pandas中基于动态偏移量实现DataFrame列值位移的策略
《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局
服装短视频如何起号推广?服装短视频起号推广有什么要求?
C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧
电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】
邮编号码查询app有哪些_邮编号码查询推荐app及使用体验
在React中正确处理HTML input type="number"的数值类型
《绝区零》2.3前瞻|直播|内容介绍
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
iPhone14开启Apple TV遥控设置
酷狗音乐多音轨设置教程
TikTok视频播放不流畅怎么办 TikTok视频播放优化方法
《雷电模拟器》自动点击设置方法
Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
GBA模拟器手柄按键设置
谷歌浏览器如何查找和删除恶意软件 谷歌浏览器内置安全清理工具使用教程
优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南
猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法
QQ邮箱PC端登录页面_QQ邮箱网页版登录界面
金牛福袋获取攻略
2025-11-07
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。