javascript sandbox 一个模块,用于防止引用 Window

javascript sandbox a module to prevent reference to Window

本文关键字:用于 Window 引用 模块 一个 sandbox javascript      更新时间:2023-09-26

我试图创建一个沙盒模块,该模块可以获取一个对象并阻止该对象的代码引用窗口。

这是它在概念中的工作方式。

var sand = function(window) {
var module = {
    say: function() {
        console.log(window.location);
    }   
};
return module;
}
sand({}).say(); // window.location is undefine

如果对象是传入的,则这不起作用

var $sand = (function(){
return function(obj, context) {
    return (function(obj, window) {
        window.module = {};
        // doesn't work even copy object
        for (p in obj) {
            window.module[p] = obj[p];
        }
        console.log(window.location); // undefine
        return window.module;
    }(obj, context));
};
}());
var module = {
say: function() {
    console.log(window.location);
}
};
$sand(module, {}).say(); // still reference to window.location

如何使此模式工作?

只要函数范围内没有变量阴影window,该函数就可以访问window。即使你有一个名为 window 的变量,代码仍然可以通过简单地省略window.来访问属性。

(function(window) {
    console.log(window.location); //undefined
    console.log(location); //this will still work
})({ });

换句话说,在浏览器环境中对 JavaScript 进行沙盒处理是不可能的。

在你的第一个例子中,窗口undefined的唯一原因是因为你传入一个空对象并调用参数window,所以它隐藏了真正的window

此外,您始终可以通过将 this 变量提升到闭包中来访问窗口对象,如下所示:

console.log ( ( function () { return this; } )() );

因此,即使您以某种方式设法阻止window,再次将其取回也是微不足道的。

如果您在沙盒之外定义函数,则上下文将是当前上下文,否则您实际上无法这样做。

如果你真的想做一些沙盒,那么你应该使用 iframe 来实现这一点。看看 https://github.com/substack/vm-browserify 它是node的vm模块的浏览器版本,你应该能够提取一些好的工作,并避免eval对于你想做的事情来说不是真正干净的。

相关文章: