我希望客户端能够发送将在服务器上运行的脚本。在运行之前,管理员将查看这些脚本,但是如果没有看到漏洞,我想防止灾难。
客户端应该只能使用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
类似的内容。
答案 0 :(得分:0)
您可以使用this
更改功能.bind
。例如:
var api = {
incr: (function() {
return v++;
}).bind(api)
}
请注意,这尚未经过彻底测试。 可能仍然有办法颠覆这种方法,但这会阻止一些攻击。一般来说,首先在服务器上运行用户代码是一个坏主意,VM或者没有我真的很惊讶Node允许这样的陷阱。发布有关它的错误报告可能是个好主意。