gpt4 book ai didi

javascript - runInNewContext 究竟做了什么?

转载 作者:数据小太阳 更新时间:2023-10-29 06:06:24 25 4
gpt4 key购买 nike

我目前正在学习一些代码库,它使用runInNewContext的频率更高,我尝试查找但没有合适的定义。

阅读official docs指定,我所能理解的是 code 被编译到指定的 sandbox 中。这到底是什么意思,例如,代码库中有一些代码类似于:

request(url, function(error, response, body) {
var subject = {}
try
vm.runInNewContext(body, subject, url);
deferred.resolve(subject);
catch _error
console.log(_error);
}

这里到底发生了什么让我感到困惑。

看到这个,我尝试通过传递一个不同的对象而不是 body 来玩弄,但它吐出“意外的标识符”。

最佳答案

runInNewContext 创建代码在其中运行的新“上下文”或“沙箱”。

例如,您有一段要运行的代码,它是作为字符串加载的。仅对字符串进行 eval 操作可能很危险,并且您几乎无法控制此代码具有哪些变量和全局变量。

因此,相反,您可以创建一个沙箱,一个新的上下文,可以在其中运行此代码。此外,您可以“预设”您希望可用的变量,无论是作为上下文还是作为将内容传递到上下文的方式。

假设您的代码如下所示:

var code = "var add = function(a,b){return a + b;}; add(one,two);";

这是一个函数,定义在一个字符串中,将两个数相加,然后主动相加onetwo。什么是 onetwo?现在它们是未定义的。但是如果你在一个新的上下文中运行它,你可以(合理地)安全地运行字符串代码,甚至可以定义 onetwo:

vm.runInNewContext(code,{one:1,two:2});

这将导致代码运行和 add(1,2)。一个更有用的例子可能是保存它。

var result = 0, code = "var add = function(a,b){return a + b;}; result = add(one,two);";
vm.runInNewContext(code,{one:1,two:2,result:result});
console.log(result); // spits out 3

请注意,我们在沙箱上下文中创建了一个变量 result,以便 code 中的代码可以设置它。

我在cansecurity的declarative authorization中使用了它,你可以在其中设置一个要计算的表达式,只有当结果为true时输出才会通过。 https://github.com/deitch/cansecurityhttps://github.com/deitch/cansecurity/blob/master/lib/declarative.js#L96

在那种情况下,我实际上接受了结果。例如,我的代码可能是

var str = "user.id === req.user || user.role === 'admin'";
var authorized = vm.runInNewContext(str,{user:{id:"10",name:"John"},user:{role:"member",id:"10"}, req:{user:"20"}});
console.log(authorized); // spits out false, because user.id !== req.user, and user.role !== "admin"

关于javascript - runInNewContext 究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27394399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com