avi*_*oth 5 javascript node.js
我目前正在学习一些代码库,并且它runInNewContext经常使用,我试着查找,但没有正确的定义.
阅读官方文档指定,我所能理解的code是符合sandbox指定的.究竟是什么意思,例如,代码库中有一些代码如下:
request(url, function(error, response, body) {
var subject = {}
try
vm.runInNewContext(body, subject, url);
deferred.resolve(subject);
catch _error
console.log(_error);
}
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么使我感到困惑.
看到这个,我试图通过传递一个不同的物体而不是身体玩弄它,但它吐出"意外的标识符".
runInNewContext 创建一个新的"上下文"或"沙箱",代码在其中运行.
例如,假设您有一大堆要运行的代码,它们将作为字符串加载.只是eval字符串可能是危险的,并且几乎无法控制此代码具有的变量和全局变量.
因此,您可以创建一个沙箱,一个新的上下文,可以在其中运行此代码.此外,您可以"预设"您想要的变量,无论是作为上下文还是将事物传递到上下文中.
所以说你的代码看起来像这样:
var code = "var add = function(a,b){return a + b;}; add(one,two);";
Run Code Online (Sandbox Code Playgroud)
这是一个函数,在字符串中定义,添加两个数字,然后主动添加one和two.什么是one和two?现在他们是未定义的.但是如果你在新的上下文中运行它,你可以(合理地)安全地运行字符串代码甚至定义one和two:
vm.runInNewContext(code,{one:1,two:2});
Run Code Online (Sandbox Code Playgroud)
这将导致代码运行和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
Run Code Online (Sandbox Code Playgroud)
请注意,我们result在沙箱上下文中创建了一个变量,以便代码code可以设置它.
我在cansecurity的声明性授权中使用它,您可以在其中设置要评估的表达式,并且只有结果才会传递输出true.https://github.com/deitch/cansecurity查看https://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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
923 次 |
| 最近记录: |