簡體   English   中英

runInNewContext到底做了什么?

[英]What exactly does runInNewContext do?

我目前正在學習一些代碼庫,並且它經常使用runInNewContext ,我試着查找但是沒有正確的定義。

閱讀官方文檔指定,我所能理解的是codecode到指定的sandbox中。 究竟是什么意思,例如,代碼庫中有一些代碼如下:

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

這里到底發生了什么使我感到困惑。

看到這個,我試圖通過傳遞一個不同的物體而不是身體玩弄它,但它吐出“意外的標識符”。

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的聲明性授權中使用它,您可以在其中設置要評估的表達式,並且只有在結果為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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM