我目前在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++函數。這個特殊的例子不會出現在我的項目中,但它展示了這個問題的安全性。
通過列入黑名單,您的意思是搜索代表非法功能的實際字符串的客戶端代碼並拒絕?雅,這不會工作。 – Yakk
我知道,但我想不出有任何其他的方式來做到這一點。 –
白名單。將允許的代碼中的呼叫替換爲加密的獨特名稱?失敗需要敵對代碼來獲取源或其他人的電話或枚舉入口點或其他。 – Yakk