是否可以使用eval()
来评估JavaScript代码并确保该代码无法访问某些对象?
示例:
(function(window, location){ eval('console.log(window, location)'); })()
上述代码似乎没有通过引用window
对象直接访问,因为它在该范围内是undefined
。但是,如果另一个对象全局存在且它包含对window
的引用,则可以访问它。
如果我向window, location
添加任何可能包含对window
的引用的其他对象或变量,那么评估的代码是否能够引用window
对象?
我正在尝试创建一个平台,用户可以使用js文件上传用户应用程序,并以权限的形式提供对特定API的访问权限。
答案 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 模块。