2016-10-26 48 views
1

我目前在C++環境中使用V8。我正在製作一個服務器客戶端系統,以便人們可以將JS發送到服務器並讓它在服務器上運行。它按預期工作,但我正在研究如何製作沙箱環境。我試圖避免僅從客戶端代碼列入黑名單函數名稱。V8暴露類,但限制,特別是代碼

我打算結構有兩種類型的文件:

JS庫文件:用來寫JS庫在沙箱中使用。有權訪問已經暴露給V8的C++類。在這個文件中定義的函數將被客戶端訪問。

沙箱:這將能夠訪問JS庫文件中定義的函數,但無法訪問暴露給V8的C++類。

這將允許系統的「管理員」使用EXTREMELY強大的暴露C++類編寫JS庫文件,但會限制客戶端僅使用lib文件中定義的函數以及它們自己定義的任何內容。

如果不是完全清楚,這裏是一個示例場景:

JS庫文件(isInNationLib.js):

function isInAmerica(clientName) { 
    var ip = ipByClientName(clientName); 
    //use the ip to find if the client is in America 
} 

客戶端文件:

#include "isInNationLib" 
function getNationality(clientName) { 
    if (isInAmerica(clientName)) { 
     return "American"; 
    } 
    etc... 
} 

從上面的例子中,出於安全原因,客戶端永遠不應該訪問ipByClientName。 ipByClientName是一個暴露給V8的C++函數。這個特殊的例子不會出現在我的項目中,但它展示了這個問題的安全性。

+0

通過列入黑名單,您的意思是搜索代表非法功能的實際字符串的客戶端代碼並拒絕?雅,這不會工作。 – Yakk

+0

我知道,但我想不出有任何其他的方式來做到這一點。 –

+0

白名單。將允許的代碼中的呼叫替換爲加密的獨特名稱?失敗需要敵對代碼來獲取源或其他人的電話或枚舉入口點或其他。 – Yakk

回答

0

當您創建上下文時,可以指定添加到該上下文的內容 - 在創建上下文時將其設置爲ObjectTemplate,或者在上下文的全局對象上調用Set

製作兩個contexts,其中一個可以訪問受限制的內容,另一個不是,並根據您擁有的任何授權機制將傳入的JavaScript路由到適當的上下文。