Node.js 中的 vm.constants.DONT_CONTEXTIFY() 函数

2025年3月17日 | 阅读 3 分钟

在 Node.js 中,vm.constants.DONT_CONTEXTIFY() 函数可以被确定为 vm,它在翻译中的意思是“虚拟机”。虚拟机 (vm) 模块允许 JavaScript 代码在与主执行环境隔离的上下文中运行。因此,潜在不受信任的程序可以更安全地运行。虚拟机模块中的 vm.constants.DONT_CONTEXTIFY 函数决定了当一个项被传递到新上下文时如何处理。通常 Node.js 会通过将它们附加到虚拟机的唯一执行上下文来“上下文化”这些项。使用 DONT_CONTEXTIFY 标志来解绑虚拟机上下文和正常环境之间的常见元素,以防止这种绑定。在两个场景中它可能非常有用:更简单的任务上下文管理和安全的不可信程序执行。

vm.constants.DONT_CONTEXTIFY 的作用是什么?

当一个对象与 vm 模块一起使用时,Node.js 通常会“上下文化”它。但是,通过这样做,它会将该项绑定到特定的上下文,并在之后允许在该上下文内运行。可能仍然存在一些情况,我们希望将一个项放入一个上下文而不先将其绑定到该上下文,这就是 DONT_CONTEXTIFY 常量所使用的。简单来说,DONT_CONTEXTIFY 设置告诉 Node.js 引擎,当一个对象被传递进来时,不应该与新上下文关联或绑定,这样它就不会完全嵌入到 虚拟机 的环境中。

用例

  • 安全地执行不受信任的代码。
  • 代码是分开评估和故障排除的。
  • 在具有受管 全局变量 的沙箱中执行 JavaScript。

示例 1

让我们用一个例子来说明 Node.js 中的 vm.constants.DONT_CONTEXTIFY() 函数。

输出

 
100   

说明

在此示例中,DONT_CONTEXTIFY 标志指定分配给虚拟机的某些变量或对象不应与 VM 的内部上下文建立紧密关系。当对象必须在主上下文和虚拟机之间传递而又无需完全封装时,这一点非常有用。

示例 2

让我们用另一个例子来说明 Node.js 中的 vm.constants.DONT_CONTEXTIFY() 函数。

输出

 
50   

说明

  • 沙箱中有两样东西:一个 **externalVar** 和一个函数 multiply,它将给定的数字乘以 **externalVar。**
  • 在新环境中,脚本通过使用沙箱中的 multiply 函数来运行。
  • 由于 externalVar 不会因为 DONT_CONTEXTIFY 标志而被隔离到 VM 上下文,因此 multiply 函数可以从原始上下文中访问它。

示例 3

让我们用另一个例子来说明 Node.js 中的 vm.constants.DONT_CONTEXTIFY() 函数。

输出

 
11   

说明

  • 沙箱包含一个 increment 函数和一个 count 变量,它们都会增加 count 的值。
  • 脚本在虚拟机上下文中使用 increment() 运算符。
  • 由于 DONT_CONTEXTIFY 设置禁止完全隔离,increment 方法可以更改原始上下文中的 count 变量。

结论

在 Node.js 中,vm.constant.DONT_CONTEXTIFY() 中的变量提供了对项在 VM 模块上下文之间移动时如何处理的精确控制。使用此标志,用户可以通过不完全“上下文化”虚拟机中的项来启用原始环境和虚拟机上下文之间的共享访问。这对于设置沙箱环境或运行需要与外部对象进行某些交互但又不需要完全暴露的不受信任的代码非常重要。因此,特别是对于复杂或沙箱化的应用程序,DONT_CONTEXTIFY 将非常有用,因为它提供了对执行上下文的处理和控制。


灵活性