使用 ES6 模块和 globalThis 创建安全的 JavaScript 沙箱

使用 ES6 模块和 globalThis 创建安全的 JavaScript 沙箱
使用 ES6 模块和 globalThis 创建安全的 JavaScript 沙箱

掌握 JavaScript 中的 globalThis 以实现安全上下文隔离

在编写与外部或不受信任的输入交互的 JavaScript 代码时,必须防止对全局对象进行未经授权的访问。这保证了您周围环境的安全性和一致性。控制全球范围的一种当代方法是通过 globalJavaScript 有一个相对较新的功能,称为 this 目的。

全球无论使用 Node.js 还是浏览器,开发者都可以通过它跨环境访问全局上下文 目的。至关重要的是, 国际因为这个 是可重新配置的,可以通过临时覆盖它来创建沙箱或受控执行环境。

开发人员可以使用此功能隔离代码执行,这在处理不受信任的输入时特别有用。我们可以通过建立唯一的全局上下文来对代码进行沙箱处理,该上下文仅允许访问预定的变量集,同时防止暴露全局对象的其余部分。

本文将讨论如何使用 全局这个 和ES6模块来构建沙箱。我将演示一个概念证明,该概念可以暂时取代全局上下文,以保证在受监管的环境中安全执行代码。

命令 使用示例
globalThis myContext = globalThis; - 无论是在浏览器还是 Node.js 中,globalThis 是一个唯一的对象,提供对全局对象的通用引用。在这里,它被覆盖以模拟沙箱并建立唯一的全局范围。
Proxy 让 mySandbox = new Proxy(sandboxHandler, myContext); - 可以通过代理拦截并重新定义对象的操作;在此示例中,可以控制对沙箱上下文变量的访问。
get get: (target, prop) =>获取:(目标,道具)=> { ... } - 的 得到 代理中的 trap 拦截对沙箱对象属性的访问尝试,确保只返回允许的属性,对于未定义的属性抛出错误。
finally 最后 GlobalThis 等于savedGlobal; - 无论执行过程中是否发生错误, 最后 block 确保通过恢复原始全局上下文来维护全局对象的完整性。
ReferenceError '财产未定义';抛出新的引用错误; - A 参考错误 手动抛出以处理尝试访问沙箱中未定义变量的情况,通过防止意外访问来提高安全性。
IIFE ((globalThis) =>((globalThis) => { ... })(globalThis); - 一个 国际教育学院 (立即调用函数表达式)用于创建本地作用域,保护全局对象在执行沙盒代码时免遭意外暴露。
try...catch '财产未定义';抛出新的引用错误; - A 参考错误 手动抛出以处理尝试访问沙箱内未定义变量的情况,通过防止意外访问来提高安全性。
savedGlobal '属性未定义';抛出新的引用错误; - A 参考错误 手动抛出以处理尝试访问沙箱内未定义变量的情况,通过防止意外访问来提高安全性。

使用 ES6 模块和 globalThis 构建安全的全局上下文

所提供脚本的主要目标是提供 沙盒环境 其中全局对象(全局这个) 暂时被替换。此方法允许您隐藏原始全局对象中的重要变量或属性,这在处理外部或不受信任的代码时非常有用。重新定义全局范围通过本质上限制代码仅访问沙箱中声明的属性,确保更好地控制变量访问。

保存原件 全局这个 到局部变量(已保存全局) 是第一个示例中过程的第一步。这是重要的一步,因为一旦执行沙盒代码,全局上下文将被恢复。用新对象替换全局上下文后(这里, 我的上下文),该脚本尝试检索变量(此处, 一个)位于此沙箱内。正如提到的第一个问题中所演示的,如果未指定某些变量,则会引发引用错误。最后, 最后 block 确保在执行时始终恢复全局上下文,避免对应用程序的其他区域产生任何意外影响。

第二种方法利用 代理人 反对改进这一程序。在 JavaScript 中,代理使程序员能够重新解释和拦截对对象执行的操作。在此脚本中,代理监视属性访问请求并确定沙箱对象中是否存在所需的属性。一个 参考错误 如果无法找到该属性,则会抛出该异常,以保证无法访问外部变量。因此,它是在动态沙箱设置中保护全局范围和管理变量访问的强大选择。

为了完全隔离沙箱执行,第三个脚本采用了 IIFE(立即调用函数表达式)。外部代码很难访问或干扰全局上下文,因为 IIFE 模式将整个操作包装在其自己的本地范围内。这种方法更安全,因为 globalThis 不暴露于外界,仅在 IIFE 内更改。通过保证所有沙盒代码在完全隔离的环境中运行,它增强了脚本操作的安全性和一致性。

使用 ES6 模块构建沙箱来管理全局 JavaScript 上下文

这个方法会覆盖 全局这个 使用 JavaScript (ES6) 构建一个安全维护全局上下文的沙箱。它为前端动态应用程序提供了简单的概念证明。

let myContext = { a: 1, b: 2 };
let f = () => {
    let savedGlobal = globalThis;  // Save the original globalThis
    globalThis = myContext;        // Overwrite globalThis with the sandbox context
    try {
        let result = a + b;         // Attempt to access a and b within the sandbox
        return result;              // Return the calculated result
    } catch (e) {
        console.error(e);           // Catch errors, such as reference errors
    } finally {
        globalThis = savedGlobal;   // Restore the original global context
    }
};
console.log(f());

增强方案:使用Proxy拦截全局访问

该技术通过使用代理对象拦截全局上下文访问来防止意外的变量暴露,从而提高安全性和模块化。适合在 JavaScript 前端和后端设置中使用。

const myContext = { a: 1, b: 2 };
const sandboxHandler = {
    get: (target, prop) => {
        if (prop in target) {
            return target[prop];
        } else {
            throw new ReferenceError(\`Property \${prop} is not defined\`);
        }
    }
};
let mySandbox = new Proxy(myContext, sandboxHandler);
let f = () => {
    let savedGlobal = globalThis;
    globalThis = mySandbox;           // Overwrite with sandbox proxy
    try {
        let result = a + b;           // Access sandbox variables safely
        return result;
    } catch (e) {
        console.error(e);
    } finally {
        globalThis = savedGlobal;      // Restore global context
    }
};
console.log(f());

使用 IIFE 实现更好的上下文隔离的解决方案

该方法通过使用立即调用函数表达式(IIFE)完全封装沙盒环境。它保证不在指定上下文内的变量根本不可访问。

((globalThis) => {
    const myContext = { a: 1, b: 2 };
    const f = () => {
        let result = myContext.a + myContext.b;  // Access sandbox variables directly
        return result;
    };
    console.log(f());                // Log the result of the sandboxed function
})(globalThis);

扩展 JavaScript 沙箱中自定义全局上下文的使用

雇用的另一个好处 global它与许多上下文的兼容性,例如Web浏览器和像Node.js这样的服务器端系统,是这样的 在沙箱情况下。本质上,当您使用自定义上下文覆盖全局对象时,您正在将代码的重点重新路由到受控变量集合,如我们的示例所示。当运行不受信任的第三方脚本或分离大型在线应用程序的不同模块时,此策略对于防止变量交叉污染特别有用。

事实上,JavaScript 中的 ES6 模块系统具有内置的作用域技术,可以部分分隔变量,这是另一个关键因素。另一方面,使用 全球通过让我们能够管理整个全球局势, 使我们能够超越这一点。通过阻止不应访问它的脚本查看原始全局上下文,这不仅增强了安全性,还有助于防止无意覆盖全局变量。此方法非常适合保护应用程序免受恶意或编写不当的代码的侵害。

将 ES6 模块与 代理 在您需要细粒度控制应用程序的哪些组件可以访问全局对象的情况下,可以进一步提高安全性。通过过滤对全局对象中特定属性的访问,代理可以确保只有允许的属性才能被访问。多租户应用程序中每个租户的数据需要与其他租户的数据完全隔离。该解决方案具有可扩展性,可适应各种用例。

有关 ES6 模块全局上下文沙箱的常见问题

  1. 的作用是什么 globalThis 在 JavaScript 中?
  2. '财产未定义';抛出新的引用错误; - A 参考错误 手动抛出以处理尝试访问沙箱中未定义变量的情况,通过防止意外访问来提高安全性。
  3. 为什么沙箱在 JavaScript 中很重要?
  4. 保护敏感变量、限制未经授权的程序访问全局对象以及隔离代码执行都可以通过沙箱实现。
  5. 如何 Proxy 对象提高沙箱安全性?
  6. 一个 Proxy 是沙箱环境安全的有效工具,因为它可以拦截属性访问并限制仅访问预定义的属性。
  7. IIFE 如何帮助隔离全球环境?这意味着什么?
  8. IIFE(立即调用函数表达式)封装了代码执行,防止外部访问全局对象并确保沙箱的完全隔离。
  9. IIFE(立即调用函数表达式)隔离代码执行,禁止外部访问全局对象并提供沙箱的完全隔离。
  10. 不建议使用已弃用的 with 陈述。当代的替代品,例如 globalThisProxy 对象提供更可靠和安全的选择。

关于创建安全 JavaScript 沙箱的最终想法

使用 globalThis 设置沙箱 ES6 模块中的内容是一种可管理且安全地调节变量访问的有效技术。它可以更安全地运行不受信任的代码,并保证关键全局变量的保护。

此方法允许开发人员在使用时完全修改和控制其全局上下文 代理。该技术通过防止对非沙盒变量的未经授权的访问来创建更安全的环境,尤其是在复杂或多租户系统中。

JavaScript 上下文和沙箱的来源和参考
  1. 详细文档 全局这个 对象及其用法引用自 MDN Web 文档。它解释了如何 全局这个 提供对全局对象的通用引用,以及如何出于安全目的覆盖它。 MDN 网络文档 - globalThis
  2. 使用指导 代理人 用于增强沙箱安全性并拦截对对象属性的访问的对象改编自官方 ECMAScript 文档。 ECMAScript 代理对象
  3. OWASP 安全编码实践指南对 JavaScript 中用于提高 Web 应用程序安全性的沙箱和上下文隔离的一般概念进行了审查。 OWASP 安全编码实践