在隔离环境中使用eval()

时间:2015-05-26 14:28:17

标签: javascript

是否可以使用eval()来评估JavaScript代码并确保该代码无法访问某些对象?

示例:

(function(window, location){ eval('console.log(window, location)'); })()

上述代码似乎没有通过引用window对象直接访问,因为它在该范围内是undefined。但是,如果另一个对象全局存在且它包含对window的引用,则可以访问它。

如果我向window, location添加任何可能包含对window的引用的其他对象或变量,那么评估的代码是否能够引用window对象?

我正在尝试创建一个平台,用户可以使用js文件上传用户应用程序,并以权限的形式提供对特定API的访问权限。

2 个答案:

答案 0 :(得分:2)

在JavaScript中,任何全局调用的函数(即不在对象上)都会将其this参数设置为全局对象(在窗口的浏览器中)。所以这个片段:

(function(window, lovation) { eval('(function () { console.log(this) })()'); })()

打印出当前窗口对象

答案 1 :(得分:0)

EDIT:正如 @FZs 在评论中提到的,根据 vm documentation

<块引用>

vm 模块不是一种安全机制。不要用它来运行不受信任的代码。

而且,我发现 vm2 模块似乎比内置 vm 更安全。

但是,你还是要小心。


如果您使用的是 NodeJS,则可以使用 vm module

简单地做:

const ctx = {
    x: 1337,
    console // expose console to vm
  };
ctx.window = ctx; // make window to circular to context

vm.createContext(ctx);

vm.runInContext('console.log(window)', ctx);
vm.runInContext('x = 7331', ctx);

console.log(ctx.x);

而且,如果不使用 NodeJS 会怎样? vm-browserify 为浏览器模拟 vm 模块。

参考:
Example of a circular reference in Javascript?