我目前正在C ++环境中使用V8。我正在建立一个服务器客户端系统,以便人们可以将JS发送到服务器并让它在服务器上运行。它按预期工作,但我有一个泡菜搞清楚如何制作沙盒环境。我试图避免将客户端代码中的函数名列入黑名单。
我要使用的结构有两种类型的文件:
JS库文件:用于编写用于沙箱的js库。可以访问已暴露给V8的C ++类。客户可以访问此文件中定义的函数。
Sandbox:这将能够访问JS库文件中定义的函数,但无法访问暴露给V8的C ++类。
这将允许系统的“管理员”使用极其强大的公开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 :(得分:0)
创建上下文时,指定添加到该上下文的内容 - 通过在创建上下文时在ObjectTemplate
中设置它或在上下文的全局对象上调用Set
之后。
制作两个contexts
,一个可以访问受限制的内容,另一个不在其中,并根据您拥有的授权机制将传入的javascript路由到适当的上下文。