在Sandbox中的Nodej上运行客户端代码

时间:2016-06-06 03:45:10

标签: javascript node.js virtual-machine

我希望客户端能够发送将在服务器上运行的脚本。在运行之前,管理员将查看这些脚本,但是如果没有看到漏洞,我想防止灾难。

客户端应该只能使用API​​定义的功能。我的策略是创建使用vm来创建一个只能访问api的新上下文。

var vm = require('vm');

var v = 0; //incremetable via API

var api = {
    incr:function(){
        v++;
    }
}

var userCode =
`(function(api){
    api.incr();
    process.exit();     //ERROR: process is undefined
 })`;

vm.runInNewContext(userCode)(api);

console.log(v);

从理论上讲,它看起来很好。但是,事实证明你仍然可以通过

崩溃服务器

api.incr.constructor("return this")().process.exit(1)

如何在不破坏我的服务器的情况下提供API(也就是脚本的容量来改变主要上下文)?

与浏览器中的iframe类似的内容。

1 个答案:

答案 0 :(得分:0)

您可以使用this更改功能.bind。例如:

var api = {
   incr: (function() {
       return v++;
   }).bind(api)
}

请注意,这尚未经过彻底测试。 可能仍然有办法颠覆这种方法,但这会阻止一些攻击。一般来说,首先在服务器上运行用户代码是一个坏主意,VM或者没有我真的很惊讶Node允许这样的陷阱。发布有关它的错误报告可能是个好主意。