Deno 是一个新兴的 JavaScript 运行时环境,它是由 Node.js 的创始人 Ryan Dahl 所创建的,与 Node.js 相比,Deno 做了一些不同的尝试,其中比较显著的就是“安全性”的改进。Deno 针对浏览器和服务器两端设计,扩展了浏览器的能力,同时解决了 CommonJS 的一些问题,更加符合现代 JavaScript 语言特性。在 Deno 中,在代码执行前需要明确给予权限,这种权限管理的机制与 Node.js 有很大的不同,本文就来详解一下 Deno 的权限管理机制。
Deno 的安全设计
Deno 采用了诸多安全措施来保护应用程序免受潜在威胁,其中最显著的措施就是默认禁止读写操作,也就是说 Deno 不会允许任何文件和网络的操作,直到显示地赋予了相关的权限。而 Node.js 并没有类似的安全机制,它的默认行为就是拥有完整的系统访问权限,这会给攻击者提供更多的机会。Deno 的相对安全性在很大程度上得益于它的 Rust 代码库,Rust 语言致力于提供系统级别的安全保障,是一种内存安全、数据并发安全、线程安全、无垃圾回收等特性集于一身的系统编程语言,现在成为了 WebAssembly 的事实标准语言。
Deno 的权限管理机制
Deno 的权限管理机制为模块的导入引入了一种新的方式,不同于 Node.js 中的 require(),Deno 中需要显式地给予权限,这也是它的突出特点之一。在 Deno 中,一个模块如果需要读取文件或者向网络发送请求等等任何操作,则它需要在引用该模块时指定相关的权限。Deno 将所有的需要权限的操作放到了一个命名空间:Deno,这是一个全局对象,程序运行时会有多种方式获取它:
-- -------- ----- ------ - ----- ----------------------------- ------- ----- --------------- -- ---- ------ - ---------- - ---- ------- ----- -------- --------------------- ------------ ---------------- - ----- --- - ----- ----------------------------- ------ ---------- --- ----------- - -- ------ ----- -------- ---------------------- ------- ----- ------- - ------ -------- - ---- ------- -- ------ ---------------------- ------- ------- - ----- ---- - ----- ---------------- ----------------- ----------------- --------------------- - ------ ---- -------- -- ------ ---------------------- -------- ------- - ----- ---- - ----- --------------- ------- ----- ------- ------- ----- -------------------- --- ---------------------------- ---------- --------------------- - ------ -- --- - -
Deno 的权限管理机制有以下几种特点:
显示申请权限:Deno 的权限申请时显示的,每个需要相应权限的模块都需要在导入之前申请。这里没有 Node.js 中的隐式加载的机制。
权限列表:Deno 为了方便管理,将所有的操作权限都放在了 Deno 对象下的 permissions 属性上,便于管理和维护。
紧急授权:当 Deno 运行时检测到需要进行权限访问的操作时,会向用户提示需要什么权限,并且给出相应的 URL 让用户点击对应权限的按钮进行授权。
运行时权限:权限是在运行时赋予的,这意味着他们可以和程序的其它部分互动。
权限管理的指导
Deno 的权限管理机制中涉及到的权限操作及其作用如下:
--allow-env 允许在程序中操作环境变量。
--allow-net 允许 TCP,UDP,TLS 和 WebSocket 等协议。
--allow-plugin 允许程序加载浏览器插件。
--allow-read 允许程序读取目录、文件等。
--allow-run 允许程序使用子进程。
--allow-write 允许程序写文件,创建目录等。
根据需要来选择相应的权限操作,既要保证程序的安全性又要保证程序能够输出正确的结果。需要注意的是,在代码中使用权限操作时要符合开源协议和版权等规定。
权限管理的实例
下面一个例子,我们将限制程序只能访问 www.google.com,在没有给予 --allow-net 权限时代码将无法执行。
----- ---- - ----- ---------------------------------------- -- ------------ ------------------
当我们在命令行中不给予权限,程序运行时出现以下错误:
------ -------- ------ ---------- ------- ------- ------ -- -------------- ----------------------------------- -- --------------- ----------------------------------- -- -------------
我们可以通过给予权限来避免这个错误:
---- --- -------------------------- -------------------------------
结论
Deno 的权限管理机制是一个非常好的设计,它避免了 Node.js 存在的不足,并加强了程序的安全性,可以有效地避免程序遭受攻击造成损失。总之,学习 Deno 的安全机制和权限管理机制是必要的,它将为我们的代码编写提供很大的帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67027c0bd91dce0dc8478c92