Javascript 在隔离环境中使用eval()

Javascript 在隔离环境中使用eval(),javascript,Javascript,是否可以使用eval()评估JavaScript代码,并确保该代码无法访问某些对象 示例: (function(window, location){ eval('console.log(window, location)'); })() 上述代码似乎无法通过引用窗口对象直接访问,因为它在该范围内未定义。但是,如果另一个对象全局存在并且包含对窗口的引用,则可以访问该对象 如果我在窗口、位置中添加任何可能包含对窗口的引用的其他对象或变量,经过计算的代码是否能够引用窗口对象 我正在尝试创建一个平台,

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

示例:

(function(window, location){ eval('console.log(window, location)'); })()
上述代码似乎无法通过引用
窗口
对象直接访问,因为它在该范围内
未定义
。但是,如果另一个对象全局存在并且包含对
窗口的引用,则可以访问该对象

如果我在
窗口、位置
中添加任何可能包含对
窗口
的引用的其他对象或变量,经过计算的代码是否能够引用
窗口
对象


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

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

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

打印当前窗口对象

编辑:

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

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

但是,你还是要小心


如果您使用的是NodeJS,那么就有一种方法可以用于此目的

只要简单地做:

const ctx={
x:1337,
控制台//向vm公开控制台
};
ctx.window=ctx;//使窗口循环到上下文
createContext(ctx);
vm.runInContext('console.log(window)’,ctx);
vm.runInContext('x=7331',ctx);
控制台日志(ctx.x);
如果不使用NodeJS呢?有两个用于浏览器的模拟vm模块

参考:

Eval是邪恶的。如果你担心安全问题,千万不要使用它。你可能想看一些类似的图片。如果有很多事情要做的话,你自己写可能会导致痛苦的失败。既然您正在谈论上传和执行任意JavaScript,我不知道
window
在这里会起到什么作用。您是否在浏览器中运行此功能?这似乎很鲁莽。eval()不是邪恶的,只是misunderstood@R4nc1d没错,应该避免99%的时间,如果您知道自己在做什么,这种情况可能是可以接受的。@KosmasPapadatos一个好的解决方案是在不允许访问父页面的隔离的
iframe
中运行代码。然后,即使他们修改了
窗口
,也不会真正影响您的站点。然后,您可以使用
postMessage
与该
iframe
通信。这就是网站喜欢做的事情。您将看到,您的JavaScript实际上不会影响结果框架的外部,因此不可能使窗口对象无法访问?他们可以通过指定这是什么来绕过它,例如
(函数(窗口,位置){eval('(函数(){console.log(this)})();})。调用({})
@kosmapadatos。您可以查看上面注释中建议的沙盒库。@JuanMends在包装
eval
的函数上仅设置
this
,eval中的函数仍然具有
this==window
@WillSmith I do stand correct;)我甚至没有想到使用
this
的代码在evalSure中,这会起作用,但请注意,vm模块文档的第一行说“vm模块不是一种安全机制,不要用它来运行不受信任的代码。”因此,无论如何,您都必须小心。